Estou tentando imprimir -nusando o echocomando Mas se eu simplesmente digitar echo -n, ele somente emitirá uma nova linha, não aparecerá -n, em vez disso, emitirá uma nova linha.
Funciona echo -n -- -n(não tem nenhuma caixa linux à mão para testar)?
N 23rd
Estou instalando o Ubuntu em uma máquina virtual e parece muito lento, espere.
Star OS
11
Eu verifiquei - isso não acontece. Provavelmente porque é o comando bash interno e não está usando getopt(???) para analisar a linha de comando
n0rd 23/11/2015
11
Esta pergunta é feita e respondida em pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "Aplicativos em conformidade que ... possivelmente esperavam ecoar -n, devem usar o utilitário printf derivado do nono Sistema de edição "
Brandin
Primeira pergunta popular que fiz. Yay?
Star OS
Respostas:
28
O problema é que echointerpreta o -ncomo um argumento. Na implementação padrão do bash, isso significa (de help echo):
-n do not append a newline
Existem várias maneiras de contornar isso:
Transforme-o em algo que não é uma opção, incluindo outro personagem. Por exemplo, diga echopara não imprimir uma nova linha com -n, em seguida, peça para interpretar escapes de barra invertida -ee adicione a nova linha explicitamente.
$ echo -ne '-n\n'-n
Como alternativa, basta incluir um espaço
$ echo " -n"-n
Isso, no entanto, adiciona um espaço que você provavelmente não quer.
Use um caractere não imprimível antes dele. Aqui. Estou usando o backspace ( \b)
$ echo -e "\b-n"-n
Isso também adiciona um caractere extra que você provavelmente não deseja.
Use truques
$ echo n-| rev
-n
O revcomando simplesmente imprime sua saída invertida.
Você está certo que qualquer caractere `\` válido fará.
Pilot6
@ Pilot6 sim, mas o problema com essa abordagem (a sua e a minha) é que ela adiciona um caractere extra. Isso pode causar problemas na linha. Especialmente se você quiser analisá-lo e tentar algo parecido grep '^-n'. pritnfé o caminho a seguir, realmente.
terdon
Bem, printfé melhor de qualquer maneira, mas a questão é apenas justa echo.
Pilot6
2
Parece que echo -e "-n\c"faz a coisa exata.
Pilot6
11
\cé suprimir mais saída
Pilot6 23/11
15
Às vezes, é uma boa ideia usar a ferramenta certa. Você pode usar printf:
Wov! Isto é melhor que o meu; você pode explicar um pouco para "novatos" ;-)
Sadi
Obrigado, também notei que não importa onde você adiciona o retorno de carro, no início ou no final.
Sadi
@ Sadi sim, é porque adicionar qualquer coisa faz com que seja uma opção inválida. -né válido, -nfoonão é para que seja impresso.
terdon
@terdon man echotambém. Mas helpé um pouco melhor.
Pilot6
Eu sei que tem, não é relevante. /bin/echoé uma coisa completamente diferente e, quando você executa o echobash, obtém o built-in que pode ser bem diferente dependendo do seu shell.
Ter23
5
Eu acho que se você definitivamente quiser usar echoapenas isso deve satisfazê-lo:
echo "-n "
Isso funciona porque while -né uma opção válida para echo, -ncom um espaço depois que não é. Como não é uma opção, echoapenas imprima.
Sim, acabei de responder dessa maneira. Excluirá minha resposta. Isso é relativamente portátil em que ele funciona com built-in de eco e /bin/echopelo menos se invocado comoecho -e "\055n"
abligh
-en não é o que eu quero.
Star OS
2
Para estender a resposta da @ AB, a única maneira portátil de usar echoé abster-se de usar opções como -n. Considere o uso, printfse disponível. Esta página de referência fornece mais detalhes e explica muito bem quando e como echoe printfdeve ser usado:
Atualmente, o echo (1) só é portátil se você omitir sinalizadores e escapar sequências. Use printf (1) em vez disso, se precisar de mais do que texto simples.
Primeiro comando de saída -pilot6@Pilot6:~$. As segundas saídas n.
Pilot6
@ Pilot6 Depende se você está executando no terminal interativo ou em um script bash, que não está especificado na pergunta. OTOH, se você precisar no terminal, é simples combinar as duas linhas com &&- eu não diria que esta resposta está errada .
user12205
Vou editá-lo para que fique muito mais claro que é para um script bash.
echo -n -- -n
(não tem nenhuma caixa linux à mão para testar)?getopt
(???) para analisar a linha de comandoRespostas:
O problema é que
echo
interpreta o-n
como um argumento. Na implementação padrão do bash, isso significa (dehelp echo
):Existem várias maneiras de contornar isso:
Transforme-o em algo que não é uma opção, incluindo outro personagem. Por exemplo, diga
echo
para não imprimir uma nova linha com-n
, em seguida, peça para interpretar escapes de barra invertida-e
e adicione a nova linha explicitamente.Como alternativa, basta incluir um espaço
Isso, no entanto, adiciona um espaço que você provavelmente não quer.
Use um caractere não imprimível antes dele. Aqui. Estou usando o backspace (
\b
)Isso também adiciona um caractere extra que você provavelmente não deseja.
Use truques
O
rev
comando simplesmente imprime sua saída invertida.Use a ferramenta certa para o trabalho
fonte
grep '^-n'
.pritnf
é o caminho a seguir, realmente.printf
é melhor de qualquer maneira, mas a questão é apenas justaecho
.echo -e "-n\c"
faz a coisa exata.\c
é suprimir mais saídaÀs vezes, é uma boa ideia usar a ferramenta certa. Você pode usar
printf
:fonte
echo
, enquantoprintf
é melhor padronizada .Você pode usar este comando, mas ele adiciona um espaço extra.
Este é um tipo de truque.
-e
ativa símbolos de comando de barra invertida.\r
é um retorno de carro.Na verdade, qualquer
\
caractere válido funciona em qualquer lugar da string.Você pode ver quais são válidos por
help echo
.echo "-n"
não funciona porque-n
é usado como parâmetro paraecho
.PS A melhor solução IMHO é
Não adiciona caracteres extras .
imprime da mesma forma, mas com um novo caractere de linha.
fonte
-n
é válido,-nfoo
não é para que seja impresso.man echo
também. Mashelp
é um pouco melhor./bin/echo
é uma coisa completamente diferente e, quando você executa oecho
bash, obtém o built-in que pode ser bem diferente dependendo do seu shell.Eu acho que se você definitivamente quiser usar
echo
apenas isso deve satisfazê-lo:Isso funciona porque while
-n
é uma opção válida paraecho
,-n
com um espaço depois que não é. Como não é uma opção,echo
apenas imprima.fonte
Vocês estão realmente pensando demais.
Ou sem nova linha à direita
fonte
printf "-n\n"
pensar demais?/bin/echo
pelo menos se invocado comoecho -e "\055n"
Para estender a resposta da @ AB, a única maneira portátil de usar
echo
é abster-se de usar opções como-n
. Considere o uso,printf
se disponível. Esta página de referência fornece mais detalhes e explica muito bem quando e comoecho
eprintf
deve ser usado:fonte
No script Bash, você pode executar:
Ou no shell interativo:
Isso
echo
é um-
personagem e umn
personagem.fonte
-pilot6@Pilot6:~$
. As segundas saídasn
.&&
- eu não diria que esta resposta está errada .Três outras maneiras:
fonte
Você pode correr
Testado em Busybox Ash
fonte
ash
é o nome do Almquist Shell.