我想在 Ubuntu 上编写一个脚本来显示变量中所有目录中的所有可执行文件$PATH
。这是我的脚本:
#!/bin/bash
IFS=:
for dir in $PATH;do
echo $dir:
for files in $dir/*;do
b=$(basename $files)
[ -x "$b" ] && echo $" $b"
done
done
但输出是
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin:
/usr/games:
/usr/local/games:
/snap/bin:
/home/sudin/programming/shell:
brightness
for
ifthen
loop
mat2
myfind
searchex
为什么没有列出其他目录的可执行文件?
答案1
和
[ -x "$b" ]
您正在测试该名称的文件是否存储在$b
,没有路径,可执行;因此该脚本只会查找与PATH
当前目录中的可执行文件匹配的条目。
测试完整路径将解决此问题:
[ -x "$files" ] && printf " %s\n" "$b"
当我们这样做时,让我们修正一下引用:
#!/bin/bash
IFS=:
for dir in $PATH;do
printf "%s:\n" "$dir"
for files in "$dir"/*;do
b="$(basename "$files")"
[ -x "$files" ] && printf " %s\n" "$b"
done
done
看列出 shell 知道的所有命令以获得更全面的解决方案,它处理 中的空条目PATH
、包含 glob 和目录的格式错误的条目。