在函数参数中发送 shell 命令不起作用

Posted

技术标签:

【中文标题】在函数参数中发送 shell 命令不起作用【英文标题】:Sending shell command in function argument not working 【发布时间】:2016-11-15 17:32:30 【问题描述】:

我正在编写一个 shell 脚本,我需要在一个函数中运行我的所有命令。 我在脚本中编写了以下代码。

#!/bin/bash

function RUN_CMD() 

    CMD=$*
    echo "Command launched: \"$CMD\"."
    ($*)
    RETVAL=$?

    if [ $RETVAL = 0 ] ; then
        echo "Command successful: \"$CMD\"."
    else
        echo "Command failed with RC=$RETVAL: \"$CMD\"."
    fi
    return $RETVAL

_cmd="tr -d 'the' < file.txt > file.new"
RUN_CMD "$_cmd"

执行此代码时出现以下错误。

tr: extra operand ‘<’
Try 'tr --help' for more information.
Command failed with RC=1: "tr -d 'the' < file.txt > file.new".

我不知道我做错了什么。请帮忙。

【问题讨论】:

I'm trying to put a command in a variable, but the complex cases always fail! 【参考方案1】:

你可以在子shell中运行你的命令:

#!/bin/bash

function RUN_CMD() 

    OUT=$(/bin/bash -c "$1")
    RETVAL=$?
    echo "Command launched: \"$1\"."
    if [ $RETVAL -eq 0 ] ; then
        echo "Command successful: \"$1\", \"OUT=$OUT\""
    else
        echo "Command failed with RC=$RETVAL: \"$1\", \"OUT=$OUT\""
    fi
    return $RETVAL

_cmd="tr -d 't' < file.txt > file.out"
RUN_CMD "$_cmd"

最好, 朱利安

【讨论】:

【参考方案2】:

当您以这种方式在函数中运行 $*$@ 时,您无法处理重定向(管道等)。重定向运算符 &lt;&gt; 作为参数传递给 tr。调用函数时需要使用重定向:

_cmd="tr -d the"
RUN_CMD "$_cmd" < file.txt > file.new

或者使用eval:

_cmd="tr -d 'the' < file.txt > file.new"
eval $_cmd

【讨论】:

以上是关于在函数参数中发送 shell 命令不起作用的主要内容,如果未能解决你的问题,请参考以下文章

聚合物Ajax绑定路由参数不起作用

Django F() 表达式在函数参数中不起作用

Linux系统shell脚本之函数的使用

字符串在我的函数中不起作用作为参数powershell [重复]

主网在 Remix Solidity 智能合约中部署地址数组作为构造函数参数不起作用

为啥速记参数名称在这个 Swift 闭包中不起作用?