是否可以ls
区分可执行脚本和实际编译的二进制文件?
权限通常是相同的 ( +x
),并且两者都ls -F
带有星号后缀 ( *
),因此很难区分它们。我有一个脚本来设置 的颜色ls
,但它依赖于文件是否可执行,因此它们显示相同:
BG='01;32' # green
EX="ex=$BG" # file with execute permission
我不想依赖扩展名,因为很多文件都没有它。
cat
我想要这个,所以当我看到一些奇怪的错误消息并思考“什么代码导致了这个?”时,我知道它对文件是否安全。
如果没有标准解决方案,那么file
在一个常用函数中解析 , 的输出并插入一些独特的标记又如何呢?或者这对于 来说太慢了ls
?
答案1
您需要查看文件的内容来区分二进制文件和脚本。ls
不会这样做,它只查看文件名和元数据(类型、权限等)。
这是一个粗略的解析器,用于file
以不同的方式为脚本和二进制文件着色。它的作用就像ls -d
;添加元数据需要进行修补工作,这需要更直接的方法(例如在 Perl 或 Python 中);用于lsx somedir/*
列出目录的内容。假定文件名不包含换行符或冒号(您可以使用选项更改:
其他字符串的分隔符)。-F
file
lsx () {
file -iN -- "$@" |
while IFS= read -r line; do
name=${line%%: *}; type=${line#*: }
color=0
case $type in
application/x-executable*) color='32';;
text/x-shellscript*) color='01;32';;
application/*zip*) color='31';;
esac
printf '\033[%sm%s\033[0m\n' "$color" "$name"
done
}
答案2
你可以玩玩dircolors
。看看 的输出dircolors -p
。在我的系统上,我找到以下相关定义:
# This is for files with execute permission:
EXEC 01;32
…
# Or if you want to colorize scripts even if they do not have the
# executable bit actually set.
#.sh 01;32
如果删除#
最后一行并编写.sh 07;31
shell 脚本(所有带有扩展名的文件.sh
)将以红色闪烁。
保存您的设置~/.dircolors
并添加到您的.bashrc
行:
eval "$(dircolor $HOME/.dircolors)"