Algumas expansões acontecem antes do redirecionamento, então você precisa colocá-lo diretamente no comando tr
:
touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\' 2> /dev/null)
touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\') 2> /dev/null
onde foo é um diretório
Está lendo o nome completo do caminho do foo e criando-o como um arquivo substituindo todo '/' por '\' e colocando um diretório_ na frente para que o diretório
/home/test/foo
criaria um arquivo directory_\home\test\foo
Ele faz exatamente o que eu quero, exceto que um aviso continua imprimindo tr: warning: an unescaped backslash at end of string is not portable
a. Eu não sei o que isso significa b. Eu gostaria que não mostrasse
Eu tentei redirecionar o stderr para /dev/null
, mas não funciona. Como posso suprimir isso?
A mensagem de erro significa que você tem uma barra invertida sem escape. No mundo * nix, os caracteres especiais são 'escapados', adicionando uma barra invertida antes deles. Isso significa que eles são interpretados como caracteres simples e não especiais. Por exemplo:
$ printf 'foo\nbar'
foo
bar
O \n
é um caractere especial que significa nova linha. Mas, se escaparmos da barra, conseguimos:
$ printf 'foo\nbar'
foo\nbar
Então, você pode se livrar dele escapando da barra invertida:
touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\')
Ou redirecionando a saída de erro de tr
(não de touch
, que é o que você estava fazendo):
touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\' 2> /dev/null)
No entanto, não posso enfatizar o suficiente para que seja uma Very Bad Idea® criar nomes de arquivos com barras invertidas. Mesmo. Eles serão o inferno para analisar e lidar mais tarde. Por que não usar outro personagem?
Use aspas simples com barra dupla e você não receberá nenhum erro.
touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\')