如果我这样做/usr/bin/which --all git
,它显示我的所有出现git
在我$PATH
,在第一行显示有效的一种。
从下图中,中的git
版本/home/kmodi/stowed/bin/git
是有效的。
现在我想知道结果的真实文件名。
所以对于/home/kmodi/stowed/bin/git
,这是一个符号链接,我想知道它指向什么。
做/usr/bin/which --all git | xargs \ls -Fpl
显示符号链接参考。但是输出令人困惑..不保留列出文件的原始顺序!因此,现在查看该输出(如下),人们可能会认为其中的版本/cad/..
是有效的git
二进制路径。
有没有办法xargs
保留该订单?
如果重要的话,我正在使用tcsh
shell。
感谢 John 关于 的提示-n 1
,我终于有了我喜欢的解决方案。太乱了……那些名言!(感谢tcsh
),但它有效。
alias whichall '/usr/bin/which --all \!* \\
| xargs -n 1 \ls -Fpl --color=always \\
| awk -v OFS="" '"'"'{$1=$2=$3=$4=$5=$6=$7=$8=""; print $0}'"'"' \\
| \sed '"'"'/^$/d'"'"'; \\
'
Run Code Online (Sandbox Code Playgroud)
该xargs
命令确实保持了其参数的顺序 - 但它将所有参数都传递给了 的一个实例ls
,该实例按字母顺序为您提供输出,默认情况下会这样做。要获得您想要的行为,请-n 1
向xargs
命令添加一个参数以一次只传递一行输出ls
,或者如果使用 GNU 实现ls
,则添加一个-U
选项以告诉它不要对文件列表进行排序。
的行为ls
:
$ ls -lad /usr/bin /etc
drwxr-xr-x. 146 root root 12288 May 18 09:46 /etc
dr-xr-xr-x. 2 root root 57344 Dec 12 15:30 /usr/bin
Run Code Online (Sandbox Code Playgroud)