通常,bash 能够分配命令的多行输出:
L=`ls`
这适用于交互式 shell 和脚本。但似乎内置函数的输出无法在变量中捕获:
L=`dirs -l -p`
这在交互式 shell 中有效,但在脚本中只有第一行以变量结束,可能是由于 bash 对内置函数的不同处理。
为什么会发生这种情况,我该如何做我需要的事情?
答案1
您提出问题的方式似乎有些含糊不清。你说:
但在脚本中只有第一行以变量结束
然后你的评论表明你正在编写一个 shell 函数 - 而不是一个脚本。
我怀疑您知道脚本对于更改目录是没有用的,因为cd
脚本中的任何内容都不会传播到上级 shell。如果您确实尝试在脚本中开发目录更改器,那么您将遇到困难,因为目录堆栈是不是由从属 shell 继承:
$ 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
你可以得到一个函数来帮助:
$ 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
但是,当然,您还需要该函数cd
在当前 shell 中起作用,在这种情况下,通过命令行包装和展开参数是一项引用苦差事,因此您最好在函数中完成所有操作
$ 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
它还转而用作$(...)
反引号的同义词,以减少引用混乱。
答案2
命令的输出可能会有所不同,具体取决于它是交互运行还是在脚本内运行。例如,“多行输出”适用于export
:
#! /bin/bash
L=`export`
echo "$L"
,它为您提供的所有输出与交互式运行时一样。
但不是alias
,这不会给你任何东西。