Como faço para suprimir uma mensagem de aviso?

2
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?

    
por lonewarrior556 06.08.2014 / 16:32

3 respostas

3

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)
    
por 06.08.2014 / 16:43
4

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?

    
por 06.08.2014 / 16:43
2

Use aspas simples com barra dupla e você não receberá nenhum erro.

touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\')
    
por 28.08.2017 / 11:12

Tags