Как подавить предупреждающее сообщение?

touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\') 2> /dev/null 

где foo – это каталог

Он читает полный путь foo и создает его как файл, заменяющий все '/' на '\' и помещая каталог_ впереди, чтобы каталог /home/test/foo создавал файл directory_\home\test\foo

Он делает именно то, что я хочу, кроме предупреждения сохраняет печать tr: warning: an unescaped backslash at end of string is not portable

а. Я не знаю, что это значит. Я бы хотел, чтобы он не показывал

Я попытался перенаправить stderr в /dev/null но он не работает. Как его подавить?

Перед переадресацией происходит некоторое расширение, поэтому вы должны поместить его прямо против команды tr :

 touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\' 2> /dev/null) 

Сообщение об ошибке означает, что у вас есть необработанный обратный слэш. В мире * nix специальные символы «экранируются», добавляя обратную косую черту перед ними. Это означает, что они интерпретируются как простые персонажи, а не специальные. Например:

 $ printf 'foo\nbar' foo bar 

\n – специальный символ, означающий новую строку. Но если мы избежим косой черты, получим:

 $ printf 'foo\\nbar' foo\nbar 

Таким образом, вы можете избавиться от него, либо преодолев обратную косую черту:

 touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\\') 

Или перенаправлением вывода ошибки tr (не touch которое вы делаете):

 touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\' 2> /dev/null) 

Однако я не могу подчеркнуть, что это очень плохая идея для создания имен файлов с обратными косыми чертами . В самом деле. Они будут ад, чтобы разобраться и разобраться с ними позже. Почему бы не использовать другого персонажа?

Используйте одинарные кавычки с двойной косой чертой, и вы не получите никаких ошибок.

 touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\\')