我对shell脚本的所有特性都不是很熟悉,所以如果我想列出一个命令的实际可执行文件的完整链接链路径,我目前正在逐行手动键入:
~ $ which rename
/usr/bin/rename
~ $ file /usr/bin/rename
/usr/bin/rename: symbolic link to /etc/alternatives/rename
~ $ file /etc/alternatives/rename
/etc/alternatives/rename: symbolic link to /usr/bin/file-rename
~ $ file /usr/bin/file-rename
/usr/bin/file-rename: Perl script text executable
我想使用一个命令来代替这种多次复制/粘贴工作,该命令的名称如下:
~ $ whichf rename
提供以下输出:
rename
-> symbolic link to /etc/alternatives/rename
-> symbolic link to /usr/bin/file-rename
-> Perl script text executable
是否有人已经编写了这样的命令,并可以在这里共享它,这样就不需要重新发明轮子?
我已经想出了下面的代码:
~ $ s0=$s;echo $s0; s1=$(which rename);echo " -> $s1";s2=$(file $s1); echo " -> ${s2##*:}"
得到:
rename
-> /usr/bin/rename
-> symbolic link to /etc/alternatives/rename
但这只给出了整个路径的前两行。
2条答案
按热度按时间okxuctiv1#
使用
readlink
c9x0cxw02#
下面的代码使用
which
和file
命令沿着shell字符串操作和一个循环,该循环能够沿着符号链接的路径到达实际的可执行文件,从而提供您所要求的功能:使用它的风险自担,并有乐趣,看看有多深的链接链去命令'重命名':
并在它的帮助下发现启动'gnome-terminal'执行一个Python脚本:
为了完整起见,下面的
typef
函数代码受另一个答案的启发,但利用type
的能力进行了改进,以输出有关shell内置命令的信息:如果您想知道哪些命令被视为内置命令,请使用它:
请注意由于
whichf
和typef
使用的方法不同,因此可能会产生不同的结果。例如,命令echo
由typef报告为内置命令,而由whitef报告为/usr/bin/echo可执行文件。使用type -a echo
时,您可以看到echo可以同时是这两种命令。一个内置shell命令,并最终作为可执行文件在搜索路径中出现两次(也作为/bin/echo)。