Estou bem ciente do utilitário source
(também conhecido como .
), que pega o conteúdo de um arquivo e o executa no shell atual.
Agora, estou transformando algum texto em comandos shell e, em seguida, executando-os, da seguinte maneira:
$ ls | sed ... | sh
ls
é apenas um exemplo aleatório, o texto original pode ser qualquer coisa. sed
também, apenas um exemplo para transformar texto. A parte interessante é sh
. Eu canalizo tudo o que tenho sh
e ele executa.
Meu problema é que isso significa iniciar um novo sub shell. Prefiro que os comandos sejam executados no meu shell atual. Como eu seria capaz de fazer source some-file
se tivesse os comandos em um arquivo de texto.
Não quero criar um arquivo temporário porque parece sujo.
Como alternativa, gostaria de iniciar meu sub shell com as mesmas características do meu shell atual.
atualizar
Ok, as soluções usando crase certamente funcionam, mas geralmente preciso fazer isso enquanto estou verificando e alterando a saída, então eu preferiria que houvesse uma maneira de canalizar o resultado em algo no final.
atualização triste
Ah, a /dev/stdin
coisa parecia tão bonita, mas, em um caso mais complexo, não funcionou.
Então, eu tenho isso:
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
O que garante que todos os .doc
arquivos tenham sua extensão em letras minúsculas.
E que, aliás, pode ser resolvido xargs
, mas isso está além do ponto.
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
Então, quando eu executar o anterior, ele sairá imediatamente, nada acontece.