Digamos que eu tenho um script que quero canalizar para outro comando ou redirecionar para um arquivo (canalizando sh
para os exemplos). Suponha que eu estou usando o bash.
Eu poderia fazer isso usando echo
:
echo "touch somefile
echo foo > somefile" | sh
Eu também poderia fazer quase a mesma coisa usando cat
:
cat << EOF
touch somefile
echo foo > somefile
EOF
Porém, se eu substituir "EOF" por "EOF | sh", ele simplesmente achará parte do heredoc.
Como posso fazer com que o cat
texto saia do stdin e o direcione para um local arbitrário?
shell
io-redirection
cat
here-document
strugee
fonte
fonte
touch
existe, a menos que exista, o que exatamente você quer? é apenas ler o arquivo de entrada e redirecionar para outro com stdout?echo
- eu estava pensando qual seria o equivalente dissocat
.sh
script com várias strings e passá-lo diretamente parash
. Encontrei o seu Q procurando passar a saída de texto de vários comandos, incluindo um documento HERE, diretamente para um comando. Qual é o que o segundo exemplo da resposta de Ash faz.Respostas:
Existem várias maneiras de fazer isso. O mais simples é provavelmente o seguinte:
Outro, que é uma sintaxe melhor na minha opinião:
Isso funciona também, mas sem o subshell:
Mais variações:
Ou:
A propósito, espero que o uso da
cat
sua pergunta seja um espaço reservado para outra coisa. Caso contrário, retire-o, assim:O que poderia ser simplificado para isso:
ou:
Redirecionando a saída em vez da tubulação
Usando
cat
para obter o equivalente aecho test > out
:Vários documentos aqui
Isso produz a saída:
Aqui está o que está acontecendo:
( ... )
e executa os comandos incluídos em um subshell.cat <&3
diz para executar gato com descritor de arquivo (fd) 0 (stdin) redirecionadas de fd 3; em outras palavras, identifique a entrada de fd 3.(...)
iniciar, o shell vê os dois documentos aqui redirecionarem e substituírem fd 0 (<<EOF
) e fd 3 (3<<EOF2
) pelo lado de leitura dos pipesfonte
(cat; echo ---; exec <&3; cat) <<EOF 3<<EOF2 >out
e depois fornecer esse comando com dois blocos aqui seguidos.cat
equivalente aecho test > out
usar um heredoc. Considerando que o seu exemplo dado adicionou um redirecionamento no final do canal.Eu só quero salientar que o uso
meow
é tão válido quantoEOF
.Este script será anexado
Meow!
a um arquivo chamadocat
:Salve como
cats
e torne-o executável comchmod +x cats
e execute-o com./cats
:Explicação:
cat <<meow
é a sintaxe do documento aqui . Ele instrui o script a pegar o bloco de texto que segue esta linha, até encontrar a sequênciameow
. O conteúdo será emitido (ou enviado junto).>> cat
canaliza para o arquivo nomeadocat
.>
vez de>>
substituir o arquivo em vez de anexá-lo.Meow!
é o conteúdo do documento aqui .meow
é o marcador final do documento aqui . O conteúdo é, com o uso de>>
, anexado acat
.Piping para stdout e para um arquivo:
Para executar a tubulação solicitada, nenhum documento aqui é necessário.
cat
não pode produzir texto nem repassá-lo, mastee
é uma combinação perfeita para o que você está pedindo:Isso produzirá a string
echo
e gravaráecho
em um arquivo chamadotee
.Você também pode passar a saída
cat
, se isso fizer parte do requisito, com:Ou apenas:
Conteúdo do arquivo:
fonte
>
não cria canos como sua última bala implica.>
pode criar pipeszsh
quando o mesmo fd é redirecionado várias vezes como emecho foo >&1 > tee
orecho foo > tee | cat
, ondezsh
implementa um internotee
para alimentar a saída deecho
amboscat
e dotee
arquivo.