Você pode usar xargs
para esse tipo de coisa:
ls | grep myfile | xargs sh
xargs
lê as linhas em sua entrada e as fornece como argumentos para o programa que é dado como argumento: aqui, ele lerá a saída do grep e então executará sh long_myfile_name
. (Altere sh
para bash
se o seu script depender de recursos específicos do Bash ou de algum outro shell)
Você também pode executar sh *myfile*
com essencialmente o mesmo efeito neste caso simples - se seu grep
for mais complicado, você pode não conseguir fazer isso, mas sh "$(ls | grep ...)"
funcionará.
Dito isto, existem algumas razões pelas quais você pode não querer fazer isso: em particular, se for possível que em algum momento haja dois arquivos que correspondam ao seu grep
. Nesse ponto, uma das três coisas acontecerá: seu script recebe um argumento extra, dois scripts diferentes são executados ou outro script é executado. Você poderia, digamos, canalizar em head -n 1
para evitar os dois primeiros, mas um arbitrário será executado, o que não ajuda muito. No caso $()
, ele simplesmente falhará, o que é provavelmente o melhor de um conjunto ruim de resultados. Se houver espaços nos nomes dos arquivos, você terá que tomar ainda mais cuidado.
A conclusão da tabulação do seu shell pode ser uma opção melhor: você pode escrever *myfile*
e pressionar TAB para obter uma expansão correta ou uma indicação de que há mais de uma possibilidade, ou apenas começar a escrever o nome e a tabulação completa até o fim. Se você está executando isso em um script, basta colocar o nome completo lá - você só tem que escrever uma vez. A resposta acima da linha funcionará, mas eu não recomendo realmente.