`-` é usado apenas com cd?

45

cd - pode alternar entre o diretório atual e o diretório anterior.

Parece que eu já vi -usado como argumentos para outros comandos antes, embora não me lembre se -significa o mesmo que com cd.

Eu descobri que -isso não funciona ls.

É - usado apenas com cd?

Tim
fonte
8
Algo a ter em mente é que cdé um comando interno, não externo (nem teria como sequer funcionar como um). cd -é, portanto, um recurso no nível do shell.
Fluffy28 /
6
Eu uso o tempo todo git checkout -para mudar para o ramo anterior
wim
@ Fofo: São -usados ​​com outros builtins da mesma maneira?
Tim
Para alguns dos componentes internos de manipulação de diretório pushd, como sim. Caso contrário, o significado de "diretório anterior" não é um padrão muito útil.
fofo
1
Talvez você esteja pensando no recurso '~ -' do bash (que é interpretado como $ OLDPWD). Isso pode ser usado com 'ls' da maneira que você descreve.
abonet

Respostas:

22

As diretrizes de sintaxe do utilitário POSIX (especificamente nº 13) especificam que, para utilitários que esperam ler um nome de arquivo, -significa entrada padrão e para utilitários que esperam que um nome de arquivo seja gravado, -significa saída padrão. Por exemplo, cat somefile -copia o conteúdo somefilepara sua saída padrão, seguido pelo que lê em sua entrada padrão.

Esta diretriz não se aplica ao cdcomando, pois não lê ou grava em um arquivo. cdfaz algo diferente: o argumento -significa "o diretório anterior". O comando cd -é equivalente a cd "$OLDPWD" && pwd. Esse comportamento é específico ao cdcomando e a comandos diretamente inspirados, como pushd.

Observe que -é um operando, não uma opção. Somente argumentos que começam com -e não são apenas -ou --são opções. A principal implicação de ser um operando é que --não afeta seu significado especial. Por exemplo, cd -- -Pmuda para um subdiretório chamado -P, mas cd -- -é o mesmo que cd -, não muda para um diretório chamado -. Da mesma forma, cat -- -não lê de um arquivo chamado, -mas de entrada padrão.

Gilles 'SO- parar de ser mau'
fonte
46

-é definido nas Diretrizes de sintaxe do utilitário POSIX como entrada padrão:

Guideline 13:
For utilities that use operands to represent files to be opened for either 
reading or writing, the '-' operand should be used to mean only standard input 
(or standard output when it is clear from context that an output file is being 
specified) or a file named -.

Você pode ver esta definição para utilitários que operam com arquivos para leitura ou gravação. cdnão pertence a esses utilitários, portanto, -no cd não segue esta diretriz.

Além disso, POSIX também definido -tem significado próprio com cd :

-
    When a <hyphen> is used as the operand, this shall be equivalent to the 
    command:

    cd "$OLDPWD" && pwd

    which changes to the previous working directory and then writes its name.
cuonglm
fonte
36

cd -é realmente uma abreviação para cd "$OLDPWD" && pwd, onde $OLDPWDé definido toda vez que você altera os diretórios para o diretório em que estava.

O manuseio -depende da aplicação. Alguns aplicativos usam -para significar STDIN, por exemplo grep,awk

Outros aplicativos podem ser usados -como atalho para qualquer coisa que escolherem, como a resposta de Michael especifica, com su, -é atalho para--login

Lawrence
fonte
sim, de fato não há regra para isso.
Kiwy
2
@ Kiwy: Com o POSIX, existe uma regra para isso, veja minha resposta.
31514 cuonglm
Para ser mais preciso, existe uma regra geral, mas há muitas exceções. Também existem muitos comandos anteriores à regra ou implementações antigas que não foram atualizadas para estar em conformidade com a regra.
Barmar 30/07/2014
19

Embora Michael menciona que sue outros aplicativos podem usar -para dizer o que quiserem (leia de stdin é comum), Git faz uso -de uma forma semelhante à forma como cdfaz , para mudar ramos.

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master
dotancohen
fonte
18

Qualquer programa pode usar -como argumento, para significar o que quiser. Um exemplo comum é su, que usa -como abreviação de --login. A única convenção em que consigo pensar é que os programas que lêem arquivos costumam -significar "ler a partir de stdin" , mas isso depende inteiramente do programa

Michael Mrozek
fonte
Existem convenções padrão ou não-padrão para usar símbolos especiais como argumentos?
Tim
2

Adicionando meus dois centavos aqui. Eu uso '-' para instruir a ferramenta ps2pdf a ler da entrada padrão, como várias pessoas sugeriram anteriormente:

man -t ls | ps2pdf - ls.pdf

O one-liner acima cria uma versão em pdf da página de manual para ls no diretório atual.
Espero que alguém ache útil :).

gacanepa
fonte
2

Como respondido por gnouc , -tem seu próprio significado em cd.

No entanto, você pode replicar o comportamento de -outros programas usando ~-. Por exemplo:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
Chirag Bhatia - chirag64
fonte