Answers:
没错,您不能使用|
这种方式。原因是外壳程序在进行变量替换之前已经在寻找管道并将它们分成命令。因此,|
被视为另一个字符。
一种可能的解决方法是按原样放置管道字符:
$ cmd="sort -n"
$ ls | $cmd
如果您不想使用管道,则可以将其cat
用作“ nop”或占位符:
$ cmd=cat
$ ls | $cmd
更复杂的方法是使用bash
数组代替纯字符串:
$ cmd=(sort -n)
$ ls | "${cmd[@]}"
一旦需要命令cmd
包含引号的参数,数组的优势就变得很重要。
您可以使用eval
以下命令:
eval "ls $pipedargument"
甚至更好地定义函数,例如:
sorted() { "$@" | sort -n; }
然后使用所需的参数调用它:
sorted ls /tmp
alias ls='ls | sort -n'
我会为此使用一个函数。就像是:
### usage pipedargument cmd args ###
pipedargument()
{
sort -n <<< "$( "$@" )"
}
$ pipedargument /sbin/ifconfig eth0
RX bytes:5904986765 (5.4 GiB) TX bytes:714370767 (681.2 MiB)
RX packets:5981427 errors:0 dropped:0 overruns:0 frame:0
TX packets:4403989 errors:0 dropped:0 overruns:0 carrier:0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
collisions:0 txqueuelen:1000
inet addr:XXX.XXX.X.XX Bcast:XXX.XXX.X.XXX Mask:255.255.255.0
inet6 addr: xx00::0x0x:00xx:xx0:000/00 Scope:Link
eth0 Link encap:Ethernet HWaddr 0x:0x:00:x0:00:00