无法使用.bash\u配置文件中定义的xargs调用函数

无法使用.bash\u配置文件中定义的xargs调用函数,bash,function,expand,Bash,Function,Expand,我在.bash_配置文件中添加了以下两个函数 function dc(){ local command="docker container $@" echo $command eval $command } function dcp(){ local params=$@ local result="" for attr in $params do result=$result"{{.$attr}}\t" done

我在.bash_配置文件中添加了以下两个函数

function dc(){
    local command="docker container $@"
    echo $command
    eval $command
}

function dcp(){
    local params=$@
    local result=""
    for attr in $params
    do
        result=$result"{{.$attr}}\t"
    done

    local params="--format \"table $result\""

    echo "$params"
}
现在,请在寻源后查找以下执行情况。bash_配置文件:-

~ $

dc ls
docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
bb1bb407f422        busybox             "sh"                2 hours ago         Up 2 hours                              foo
6b0bfe6d8615        busybox             "sh"                2 hours ago         Up 2 hours                              baz

~ $

dcp Image ID
--format "table {{.Image}}\t{{.ID}}\t"

~ $

dcp Image ID | xargs docker container ls
IMAGE               CONTAINER ID
busybox             bb1bb407f422
busybox             6b0bfe6d8615

~ $

dcp Image ID | xargs dc ls
dc: unrecognized option `--format'
Usage: dc [OPTION] [file ...]
  -e, --expression=EXPR    evaluate expression
  -f, --file=FILE          evaluate contents of file
  -h, --help               display this help and exit
  -V, --version            output version information and exit

Email bug reports to:  bug-dc@gnu.org .
现在,xargs dc ls无法转换为xargs docker容器ls

如何告诉xargs展开dc ls调用

编辑1:-

根据建议,我更新.bash_配置文件中的代码,如下所示:-

dcCall(){
    echo "params are : >$@<"
    local command=( docker images "$@" )
    echo ${command[*]}
    ${command[@]}
}

export -f dcCall
alias dc="xargs bash -c 'dcCall "$@"'"


dcp(){
    local params=$@
    local result=""
    for attr in $params
    do
        result=$result"{{.$attr}}\t"
    done

    local params="--format \"table $result\""

    echo "$params"
}
但执行上述命令会产生以下结果:-

~ $

dcp Repository ID | dc
params are : ><
docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
clouderassh                    latest              93f38a6c0288        34 hours ago        6.81GB
busybox                        latest              d8233ab899d4        8 days ago          1.2MB
microsoft/mssql-server-linux   2017-CU8            229d30f7b467        8 months ago        1.43GB
cloudera/quickstart            latest              4239cd2958c6        2 years ago         6.34GB
现在,dcp存储库ID的参数没有传递给 dcCall函数中的dc和params为空

您不需要同时使用function关键字和括号。 使用数组存储命令,则无需计算:

以及通过xargs访问您的功能:

dcp Image ID | xargs bash -XXX 'dc "$@"' _ ls
如果将dc函数放在~/.profile或~/.bash_profile中,那么-XXX是-lc 如果将dc函数放在~/.bashrc中,那么-XXX是-ic 如果导出-f dc,那么-XXX就是-c 参考:

您的编辑1:

在dcCall函数中缺少所需的双引号,如上面的my函数所示 别名是用双引号字符串定义的,因此定义别名时shell变量将展开。 别名不是答案。如果您想要dcp存储库ID | dc ls行为,那么

dc() {
    xargs docker container "$@"
}
从更大的角度来看,dcp函数似乎专门为docker容器ls命令生成参数,不是吗?如果是,那么我将把xargs管道折叠成一个函数:

dls() {
    local OPTIND OPTARG
    local params=()

    while getopts ':p:' opt; do
        case $opt in
            p) params+=( "{{.$OPTARG}}"$'\t' ) ;;
            ?) echo "unknown option: -$OPTARG" >&2 ;;
        esac
    done
    shift $((OPTIND - 1))

    local docker_params=()
    if (( ${#params[@]} != 0)); then 
        docker_params+=( --format "table ${params[*]}" )
    fi

    echo docker container ls "${docker_params[@]}" "$@"
}
你会像这样使用它

dls -p Image -p ID

xargs是一个外部工具,因此它不能使用shell范围中定义的函数。xargs只能处理外部工具脚本!警告eval是邪恶的!不要对用户提交的值使用eval!从不我想在日志记录中使用相同的变量,而执行是使用eval的一个不好的理由。现在dc被声明为别名,因此可以很容易地通过管道传输,但现在参数没有传递给dc。更新了“编辑1”下的代码。
dls() {
    local OPTIND OPTARG
    local params=()

    while getopts ':p:' opt; do
        case $opt in
            p) params+=( "{{.$OPTARG}}"$'\t' ) ;;
            ?) echo "unknown option: -$OPTARG" >&2 ;;
        esac
    done
    shift $((OPTIND - 1))

    local docker_params=()
    if (( ${#params[@]} != 0)); then 
        docker_params+=( --format "table ${params[*]}" )
    fi

    echo docker container ls "${docker_params[@]}" "$@"
}
dls -p Image -p ID