将“带管道的命令”作为 bash 函数参数传递

Joe*_*Joe 6 unix bash pipe parameter-passing

我写了一个很小的 ​​bash 函数,它只运行一个命令,如果$current_user_input = yes

function if_yes_run_with {
    if [ $current_user_input = yes ]
    then
        $1
    fi
}
Run Code Online (Sandbox Code Playgroud)

我多次称其为完美,例如:

if_yes_run_with 'brew update'
Run Code Online (Sandbox Code Playgroud)

但是,我已经达到了我想向其传递包含管道的命令的地步:

if_yes_run_with '\curl -L https://get.rvm.io | bash -s stable'
Run Code Online (Sandbox Code Playgroud)

该函数似乎只评估管道之前的命令。因此,运行它的结果给出与以下相同的结果:

if_yes_run_with \curl -L https://get.rvm.io
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助将“带管道的命令”作为参数传递给 bash 函数吗?

Joh*_*ica 4

以安全、稳健的方式做你想做的事情是很困难的。Greg's Bash Wiki说得最好:

变量保存数据。函数保存代码。不要将代码放入变量中!

我不会让它直接执行命令。相反,让函数返回成功/失败。然后您可以在呼叫端使用&&或执行任何您喜欢的操作if

is_user_input_enabled() {
    [[ $current_user_input = yes ]]
}

is_user_input_enabled && brew update
is_user_input_enabled && curl -L https://get.rvm.io | bash -s stable
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要任何额外的引号或转义即可完成这项工作。

也可以看看: