嗨,我的问题很简单。我想在命令提示符下执行此操作。
var="ls | cat"
$var
现在我知道当我尝试手动执行此操作时
ls | cat
Bash把|当作一个特殊的东西。我不知道它叫什么,我知道 |它被称为管道,但我的意思是 bash 需要 |作为...并且实际上制作了一根烟斗。我还认为,当我尝试做$var bash 实际上需要 |作为字符串而不是管道。 好吧,我的问题是我怎样才能实现 bash |实际上是一根烟斗,而不是一根绳子。谢谢,我希望我清楚我的观点。
简单的解决方案:使用 eval
:
var="ls | cat"
eval $var
bash 将参数解释为eval
,就好像您在命令行上键入了它一样。
当然,请记住将eval
与用户输入一起使用的安全风险,以防这对您的程序造成问题。
这可能适用,也可能不适用 - 但听起来您可能正在寻找alias
命令。 您可以执行alias var="ls | cat"
,然后在命令提示符下执行var
,它会将其视为编写ls | cat
<</p>
尝试将可执行代码嵌入到变量中(应该用于保存数据,而不是代码),不如使用 shell 函数,该函数旨在保存代码:
my_func () {
ls | cat
}
|
被称为管道,我没有听到任何其他命名。基本上,左侧命令输出的流将作为其右侧命令的输入。在您的情况下,ls
输出进入流(即临时文件),并且该流被馈送到cat
. cat
打印文件的内容,ls
流非常像文件。
现在,您正在尝试bash
解释变量var
。为此,请尝试:
var=`ls | cat`
$var
在我的电脑上,我得到这个:
-bash: Applications: command not found
因为在我的情况下,$var
扩展到Applications Documents Downloads
,我的ls
的输出。粗略地说,bash认为这是我希望他执行的命令。如果您的意图不是执行$var
内容而是打印内容,请尝试:
var=`ls | cat`
echo $var
不需要猫,只需使用ls -1
,正如其他答案所说,您可以将其别名或放入函数中。
例如,如果要覆盖ls以在新行上打印每个文件,请执行类似操作
> alias ls='command ls -1'
> ls
file1
file2
etc...
并将其放在像~/.bashrc
这样的bash init文件中,如果您想永久更改
1)函数适用于以下任务:
func (){
ls | cat
}
通过说func
来调用它
2)另一个合适的解决方案也可以eval
:
eval 将字符串作为其参数,并像在命令行上键入该字符串一样对其进行计算。(如果传递多个参数,则它们首先用它们之间的空格连接。
var="ls | cat"
eval $var