Capture a saída de várias linhas de um bash builtin

5

Normalmente, o bash é capaz de atribuir saída de várias linhas de um comando:

L='ls'

Isso funciona tanto no shell interativo quanto nos scripts. Mas parece que a saída de um arquivo interno não pode ser capturada em uma variável:

L='dirs -l -p'

Isso funciona no shell interativo, mas no script apenas a primeira linha acaba na variável, provavelmente devido ao tratamento diferente de builtins por bash.

Por que isso acontece e como posso fazer o que preciso?

    
por Alex B 07.09.2010 / 03:06

2 respostas

6

Parece haver alguma ambiguidade na maneira como você redigiu sua pergunta. Você disse:

but in the script only first line end up in the variable

e, em seguida, seus comentários sugerem que você está escrevendo uma função de shell - não um script.

Suspeito que você saiba que os scripts são inúteis para alterar diretórios, pois qualquer cd em um script não se propaga para o shell superior. Se de fato você estiver tentando desenvolver seu alterador de diretório em um script, você terá dificuldades, já que a pilha de diretórios não é não herdada por shells subordinados:

$ dirs -l
/home/msw /home/msw/Ubuntu One /home/msw /usr/bin /usr/local /bin /usr/local
$ cat > dirs.sh
dirs -l 
$ bash dirs.sh
/home/msw

Você pode conseguir uma função para ajudar:

$ function passdirs() { bash ndirs.sh 'dirs -l -p'; }
$ cat > ndirs.sh
echo $#
echo "$@"
$ passdirs
8
/home/msw /usr/local /usr/bin /bin /usr/local /usr/bin /bin /home/msw

mas, é claro, você precisaria que a função também afetasse o cd no shell atual, no qual envolver e desembrulhar os argumentos através da linha de comando é uma tarefa de citação, então é melhor fazer tudo na função

$ function cd_pattern() {
   cd $(dirs -l -p | grep --max-count=1 -e "$1") ; dirs
}
$ dirs
~ /usr/local /bin /usr/share/doc/evince ~/Ubuntu One
$ cd_pattern v..c
/usr/share/doc/evince /usr/local /bin /usr/share/doc/evince ~/Ubuntu One

que também passou a usar $(...) como sinônimo de backticks para reduzir a confusão entre aspas.

    
por 07.09.2010 / 07:30
0

A saída de comandos pode variar, dependendo de ser executada de forma interativa ou dentro de um script. Por exemplo, "saída de múltiplas linhas" funciona bem com export :

#! /bin/bash
L='export'
echo "$L"

, que lhe dá toda a saída da mesma forma que quando você a executa interativamente.

Mas não é alias , o que não lhe dá nada.

    
por 07.09.2010 / 04:28