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.