Qual é a mágica de “-” (um traço) nos parâmetros da linha de comando?


101

Exemplos:

  • Crie uma imagem ISO e grave-a diretamente em um CD.

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • Mude para o diretório anterior.

    cd -

  • Ouça na porta 12345 e descompacte os dados enviados a ela.

    nc -l -p 12345 | tar xvzf -

Qual é a finalidade do traço e como faço para usá-lo?

Respostas:


111

Se você quer dizer nua -no final do tarcomando, isso é comum em muitos comandos que desejam usar um arquivo.

Ele permite que você especifique a entrada ou saída padrão em vez de um nome de arquivo real .

Esse é o caso do seu primeiro e terceiro exemplo. Por exemplo, o cdrecordcomando pega a entrada padrão (o fluxo de imagem ISO produzido por mkisofs) e grava diretamente no /dev/dvdrw.

Com o cdcomando, toda vez que você muda de diretório, ele armazena o diretório de onde você veio. Se você fizer isso cdcom o -"nome do diretório" especial , ele usará esse diretório lembrado em vez de um real. Você pode alternar facilmente entre dois diretórios rapidamente usando isso.

Outros comandos podem ser tratados -como um valor especial diferente .


9
note que você também pode usar -para branches git, ou seja, você pode voltar para o branch anterior comgit checkout -
snappieT

3
Onde nos documentos tar explica que é suportado? Como posso saber quais comandos o suportam?

1
Se um comando tiver um significado especial para -, você pode encontrar sua explicação na página do manual.
codeforester

su - #fazer do shell um shell de login
atongsa

Acho um comando como este muito curioso: tar -cvf - / home | aescrypt -e -p apples -> backup_files.tar.aes que na verdade é tar -cvf - / home | aescrypt -e -p apples -o backup_files.tar.aes - porque o encanamento char | deve tornar desnecessária a presença do último travessão. Mas sem o último traço, o comando falha. Parece ilógico. Alguém pode me dar uma referência onde o significado do traço nu nas linhas de comando é explicado. Não consigo encontrar nenhum.
elmclose

22

Não é mágica. Alguns comandos interpretam -como o usuário deseja ler de stdin ou gravar em stdout; não há nada de especial nisso para o shell.


9
Exceto no caso de cd -; bash(1)trata cd -como se você tivesse escrito cd $OLDPWD.
sarnold

6
@sarnold Mas o ponto é o mesmo, cd- um comando interno do shell - interpreta o próprio traço. Sem "mágica" :-)

2
@pst, com certeza, nenhuma mágica (é todo o código apenas :), mas não é algo especial para o shell.
sarnold


9

-significa exatamente o que cada comando deseja que signifique. Existem várias convenções comuns e você viu exemplos da maioria delas em outras respostas, mas nenhuma delas é 100% universal.

Não há nada mágico sobre o -personagem no que diz respeito ao shell (exceto que o próprio shell e alguns de seus comandos embutidos como cde echo, usam-no de maneiras convencionais). Alguns caracteres, como \, 'e ", são "mágicos", tendo significados especiais onde quer que apareçam. Estes são "metacaracteres de shell". -não é assim.

Para ver como um determinado comando usa -, leia a documentação desse comando .


7

A mágica está na convenção. Por milênios, as pessoas usaram '-' para distinguir opções de argumentos, e usaram '-' em um nome de arquivo para significar stdin ou stdout, conforme apropriado. Não subestime o poder da convenção!


Não superestime a capacidade das pessoas de discernir modos de falar de expressões literais. Isso não acontece há milênios.
tripleee

1
@tripleee - Verdade, mas já dura bilhões de segundos. ;-)
David R Tribble

5

Significa usar o fluxo de entrada padrão do programa.

No caso de cd, significa algo diferente: mude para o diretório de trabalho anterior.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.