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?

Chemila
fonte

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 .

paxdiablo
fonte
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.

Ignacio Vazquez-Abrams
fonte
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
13

Redirecionamento de ou para stdinou stdout.

Consulte: http://tldp.org/LDP/abs/html/special-chars.html#DASHREF2

Ry-
fonte
Como sempre, o ABS precisa ser tomado com um grão de sal. Por exemplo, isso implica que há redirecionamento aqui, mas este é distinto de operadores de redirecionamento do shell ( <, >, |, etc).
tripleee
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 .

Keith Thompson
fonte
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!

William Pursell
fonte
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.

Brian Cain
fonte