Na verdade isso é parabrew search
mas para simplificar, digamos que sim:
echo -e 'somedir\n\otherdir'
somedir
otherdir
Posso usar otherdir
como argumento sem fazer isso?
ls $(echo -e 'somedir\n\otherdir |tail -n1)
otherdir
Atualização para esclarecer a meta
Para ser mais claro somedir
e otherdir
ir para stdout, posso executar um comando apenasotherdir
Sem capturar a saída $()
e executar o comando nisso?
Só queria saber se é possível, embora ache que não pode ser feito.
Você sempre pode usar
xargs
which se destina a esse tipo de coisa: converter fluxos de saída em lista de argumentos:Cuidado
-d '\n'
, é necessário aqui que os argumentos sejam esperados, pois as linhas requerem a implementação GNU dexargs
.Se a última linha não contiver espaços em branco, nem aspas, nem barras invertidas, você poderá omiti-la.
-r
, necessário para evitar a execuçãols
se a entrada estiver vazia também é do GNUxargs
, mas hoje em dia é amplamente suportado (e estará na próxima versão do padrão POSIX).Se você não quiser usar a substituição de comando, em
bash
, você sempre pode ler as linhas da saída do comando em um array e executar o comando no último elemento desse array:Ou use
perl
:Observe que com a substituição de comando, uma vez que remove todos os caracteres de nova linha à direita, você não pode diferenciar diretamente entre uma entrada vazia e a última linha vazia. Em ambos os casos, você obtém uma expansão vazia.
Uma vantagem de usar a substituição de comando é que você pode verificar se o comando foi bem-sucedido (com base em seu status de saída) antes de decidir usar sua saída:
Ou você pode usar
grep
também para verificar se a saída não está vazia:grep '^'
corresponde ao início de uma linha. Portanto, retornará verdadeiro se a saída contiver pelo menos uma linha (vazia ou não). Porém, tenha cuidado, pois se a entrada não terminar em um caractere de nova linha, ela não será considerada uma linha de acordo com a definição POSIX de linha, e algumas implementações poderãogrep
falhar nesse caso e até mesmo descartar essa linha não delimitada.A sintaxe
$()
não salva nada. Basicamente significa "executar este comando e usar a saída como argumentos".Seu uso é a maneira canônica correta de fazer as coisas.
Em shells mais antigos (e ainda funciona), o backtick (`) faz algo semelhante
Mas
$()
é o jeito moderno e também resolve muitos problemas complicados de cotação do jeito antigo.Isso pode ser usado em quase qualquer lugar; por exemplo