无法使用.bash\u配置文件中定义的xargs调用函数
我在.bash_配置文件中添加了以下两个函数无法使用.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
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