如何从变量运行脚本命令?

sta*_*ker 9 linux bash shell command-line

我试图使用管道运行命令.

基础:

single="ls -l"
$single
Run Code Online (Sandbox Code Playgroud)

它按预期工作

管道:

multi="ls -l | grep e"
$multi
ls: |: No such file or directory
ls: grep: No such file or directory
ls: e: No such file or directory
Run Code Online (Sandbox Code Playgroud)

...没有惊喜

bash < $multi

$multi: ambiguous redirect
Run Code Online (Sandbox Code Playgroud)

接下来试试

bash $multi
/bin/ls: /bin/ls: cannot execute binary file
Run Code Online (Sandbox Code Playgroud)

只要

echo $multi > tmp.sh
bash tmp.sh
Run Code Online (Sandbox Code Playgroud)

工作.

有没有办法在不创建执行脚本的情况下执行更复杂的命令?

buk*_*zor 14

您正在展示shell和内核之间的区别.

"ls -l"可由系统execve()调用执行.你可以man execve了解细节,但这可能对你来说太详细了.

"ls -l | grep e"需要shell解释来设置管道.不使用shell,'|' 字符只是作为ls的参数传递给execve().这就是您看到"没有这样的文件或目录"错误的原因.

解:

cmd="ls -l | grep e"
bash -c "$cmd"
Run Code Online (Sandbox Code Playgroud)