Tubulação não é o mesmo que passar um argumento para um programa.
Se você executar um programa, um processo será criado. Estou simplificando aqui, mas basicamente todo processo tem um padrão e uma saída padrão. Recebe entrada através do padrão em (talvez) e produz saída em sua saída padrão (talvez). Estes são abreviados como stdin e stdout respectivamente.
Quando você executa um programa no terminal, seu padrão é o que você digita no terminal enquanto está em execução. Sua saída padrão é impressa no terminal.
O que você faz quando executa a | b
é executar a
e b
, mas conectar o stdout do processo a
ao processo stdin de b
. Ou seja, se a saída criada pelo processo a
for alimentada como entrada para o processo b
, como se você fosse executar a
e b
em terminais separados e digitar tudo a
' O processo imprime em seu terminal no terminal em que você está executando b
on. Bem, quase. Você só pode fazer um texto, por exemplo, enquanto os processos podem canalizar dados arbitrários para um processo diferente.
Você pode testar isso enviando dados para tee
.
Exemplo:
echo foo | tee
echo
lê seus argumentos e os grava em sua stdout. Sua stdout está conectada ao stdin de tee
. O Tee simplesmente lê seu stdin em uma base por linha e grava sua entrada em sua stdout. Isso significa que "foo" será impresso em seu terminal, pois esse é o stdout do processo de tee
.
echo foo | tee | tee | tee
Tem o mesmo efeito, claro.
Você pode fazer coisas mais úteis, que também são bem simples:
echo foo | sha256sum
Calcula e imprime o sha256sum de "foo \ n". Onde \n
é um feed de linha porque echo
termina sua saída em um feed de linha, caso contrário, o exemplo anterior não seria t funcionou porque tee
não teria visto um avanço de linha.
Portanto, seu comando cat PreTabs.txt | firefox
executa cat
com o argumento PreTabs.txt
, o que faz com que cat
grave o conteúdo em sua stdout. Esse stdout é o stdin de firefox
, o que significa que firefox
pode lê-lo. Não é necessário e não há uma regra de como isso deve se comportar. Parece que ele não lê ou lê e ignora.
Se você quiser passar um argumento para um programa, mas esse argumento estiver dentro de um arquivo de texto, você poderá usar os backticks. Comandos entre backticks emparelhados são executados com antecedência e sua saída é colada nesse ponto no comando externo.
Exemplo:
echo bar > foo
echo 'cat foo' > foobar
A primeira linha escreve "barra" no arquivo foo
(sobrescreve o conteúdo do arquivo, se já existir, ou cria um novo arquivo). Na segunda linha, cat foo
é executado primeiro. Ele lê seu parâmetro foo
e aprende que deve ler o conteúdo de foo
e imprimi-los em sua stdout. Este stdout é então colado onde
'cat foo'
está na segunda linha, então a segunda linha se torna
echo foo > foobar
que escreve foo
no arquivo foobar
.
Isso faz com que o Firefox faça alguma coisa:
echo "stackexchange.com" > foo
firefox 'cat foo'
abre uma nova guia que carrega o link no Firefox.
Você disse que no seu caso ele carrega o arquivo cujo nome ele obteve como parâmetro e eu realmente tenho uma vaga lembrança de que ele tenha se comportado assim no passado. Provavelmente, é uma ideia melhor dizer explicitamente o que fazer:
echo "stackexchange.com" > foo
firefox -new-tab 'cat foo'
Isso é definido na página man ( man firefox
) como:
-new-tab url
Open url in a new tab.
embora possa ser diferente para a sua versão do Firefox, é claro.