Respostas:
Nesse caso, significa 'entrada padrão'. É usado por alguns softwares (por exemplo tar
) quando um argumento de arquivo é necessário e você precisa usar stdin. Não é uma construção de shell e depende do programa que você está usando. Verifique a página de manual em caso de dúvida!
Nesse caso, a entrada padrão é o argumento para a -f
opção Nos casos em que -
não há suporte, você pode usar algo como tar xvf /proc/self/fd/0
ou tar xvf /dev/stdin
(o último é amplamente suportado em vários departamentos).
Não confie nisto para significar 'entrada padrão' universalmente. Como não é interpretado pelo shell, todo programa é livre para lidar com ele como quiser. Em alguns casos, é saída padrão ou algo completamente diferente: su
significa 'iniciar um shell de login'. Em outros casos, não é interpretado. A memória muscular me fez criar vários arquivos com o nome -
porque alguma versão de algum programa que eu estava acostumado a não entender o traço.
STDOUT
, dependendo do contexto.
/dev/stdin
ou /dev/stdout
pode ser usado se você realmente deseja um fluxo de entrada / saída. Note que é um fluxo, os programas que querem buscar em um arquivo podem não funcionar corretamente com ele como seria o caso de -
(por exemplo, ffmpeg)
bash
, o hífen é interpretado pelo shell. Consulte o Advanced Bash-Scripting Guide - Capítulo 3. Caracteres Especiais e procure o texto [traço] ou "redirecionamento de / para stdin ou stdout". Usando bash
você pode usar o hífen na maioria dos lugares que esperam um nome de arquivo. É um complemento óbvio para <| > IMHO
cat
identificadores -
(verifique a página de manual). Uma versão interna do shell cat
pode ou não, mas não é estritamente o shell inteiro. Além disso, se o shell fosse manipulado -
, você poderia dizer eco -
e expandiria para outra coisa. Em vez disso, apenas ecoa um traço (não /dev/stdin
ou /proc/self/fd/0
). E echo test > -
apenas cria um arquivo chamado -
, para que ele claramente também não o lide. Ah, e a página que você listou não diz que é manipulada pelo shell , mas sim que você pode usá-lo com cat
e diff
, os quais entendem os traços explicitamente.
Nesse caso, ele -
é realmente inútil, supondo que você esteja executando o Linux:
O GNU tar (a versão no Linux) aceita sua entrada da entrada padrão por padrão. Se você não deseja esse comportamento e deseja passar o nome do arquivo como argumento de linha de comando, precisará especificar o sinalizador f
:
tar xf filename
Então isso é o mesmo que
tar x < filename
Ou, se a entrada for compactada como no seu exemplo:
gzip -dc filename | tar x
Não é significativo especificar a f
sinalização aqui, mas como foi especificado, o nome do arquivo precisa ser fornecido -
para indicar que queremos ler da entrada padrão (consulte outra resposta). Então, repetindo, isso é redundante e um pouco estranho.
Além disso, a linha acima pode ser simplificada porque o tar do GNU pode ser instruído a transmitir a entrada através de gzip
si mesma, especificando o z
sinalizador:
tar xfz filename
- Não há necessidade de ligar gzip
explicitamente.
tar
têm z
opção.
tar
padrão a primeira unidade de fita, por motivos históricos.
/dev/sa0
no FreeBSD 9.0, /dev/rst0
no NetBSD 6.0 e no OpenBSD 5.1). O AIX 7.1 é padronizado como /dev/rmt0
. O padrão MINIX3 é /dev/sa0
. (Eu verifiquei a versão mais recente do sistema operacional em cada caso, esses não são “mainframes antigos”.) O Solaris é configurável por meio de um arquivo /etc
, que eu acho padrão como uma unidade de fita. Alcatrão GNU, alcatrão Schilling, OSX e BusyBox padrão para stdin / stdout.
tar
padrão para a segunda unidade de fita, por razões óbvias. :)
-
not precisa estar no final do comando. Por exemplo:ls -l | diff - /old_ls_output.txt
.