脚本不显示 $PATH 中的所有可执行文件

脚本不显示 $PATH 中的所有可执行文件

我想在 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 和目录的格式错误的条目。

相关内容