捕获 bash 内置函数的多行输出

捕获 bash 内置函数的多行输出

通常,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,这不会给你任何东西。

相关内容