Script shell Posix - Salva a saída do comando multi-line para variável

0

Quando salvo uma saída de comando que contém várias linhas para uma variável diretamente no meu terminal, tenho os seguintes resultados:

$ dirs=$(ls -1d /mnt/*/)
$ echo $dirs
/mnt/ext4/ /mnt/local/ /mnt/remote/ /mnt/test/
$ echo "$dirs"
/mnt/ext4/
/mnt/local/
/mnt/remote/
/mnt/test/

No entanto, ao usá-lo a partir de um shell script posix, o resultado é diferente. Aqui está o script

#!/bin/sh

dirs=$(ls -1d $1)
echo "inline"
echo $dirs
echo "multiline"
echo "$dirs"

E aqui está a saída do script

$ ./test.sh /mnt/*/
inline
/mnt/ext4/
multiline
/mnt/ext4/

Isso acontece mesmo se eu usar bash ao invés de sh.

Alguém sabe como eu poderia salvar a saída de ls -1d /mnt/*/ em uma variável mantendo a saída completa?
Eu gostaria de analisar cada um dos quatro caminhos de diretório dentro de um loop for.

    
por Arkaik 18.01.2018 / 14:33

1 resposta

5
$ ./test.sh /mnt/*/

O glob aqui se expande para os nomes de diretório como argumentos separados, como se você os tivesse escrito manualmente na linha de comando:

$ ./test.sh /mnt/ext4/ /mnt/local/ /mnt/remote/ /mnt/test/

No entanto, no próprio script, você se refere apenas ao primeiro argumento, $1 :

dirs=$(ls -1d $1)

Se você quiser se referir a todos os argumentos, use "$@" (com as aspas).

No entanto, tudo o que você está fazendo com os nomes dos diretórios aqui é executar ls neles, que apenas exibe os mesmos nomes (embora em linhas separadas). Então, se você quer apenas a lista dos argumentos como uma string, você não precisa executar o comando ls , apenas atribua dirs="$@" .

No entanto, na maioria, se não em todos os casos, é melhor manter apenas a lista de nomes de arquivos nos parâmetros posicionais, e fazer um loop sobre eles com

for f in "$@"; do ...

ou

for f
do ...

Observe que os nomes de arquivos podem conter espaço em branco e, quando você concatena os nomes em uma única string, perde o significado do espaço em branco dentro dos nomes. foo bar doo pode ser três arquivos ou os dois arquivos foo bar e doo .

    
por 18.01.2018 / 16:19