Digamos que eu tenha um diretório com três arquivos com nomes incluindo espaços: a b
, c d
e e f
. E eu quero usar vi
para editar os dois primeiros arquivos. O comando bash que eu quero é
vi "a b" "c d"
Também quero obter as duas primeiras linhas de ls
comando usando head
, para que eu possa substituir os parâmetros do primeiro comando:
ls | head -n 2
No entanto, se eu executar vi $(ls | head -n 2)
, é equivalente a vi a b c d
, o que não é o que eu quero, porque a saída dentro $()
é dividida por espaço e nova linha. Existe alguma maneira de dividir a saída apenas por nova linha?
Sim, defina
IFS
apenas uma nova linha (por padrão, contém um espaço, uma tabulação e uma nova linha):(
$''
não é padrão, mas funciona em Bash/ksh/zsh e muito mais bonito que as alternativas.)Dito isso, você ainda tem o problema de que os nomes dos arquivos podem conter caracteres glob. Para desabilitar o globbing, você precisa usar
set -f
primeiro (eset +f
depois para reativá-lo). E também, se seus nomes de arquivos contiverem novas linhas, isso não funcionará, mas suponho que você saiba disso.