Bash别名实现带条件逻辑的权限查询问题求助
解决Bash别名
perms的参数判断问题 你的两个别名都无法正常工作,核心原因是Bash别名在定义时就会立即展开其中的变量和命令替换,而非等到执行别名时才处理参数逻辑。比如$@、$1在你定义别名的瞬间就被解析成当前shell的参数(通常是空值),导致无参数时的分支根本没被正确触发。
正确的解决方案:用Shell函数代替别名
处理带参数判断的逻辑,Shell函数比别名靠谱得多,直接写这个函数即可:
perms() { if [ $# -eq 0 ]; then # 无参数时显示当前目录所有文件/文件夹权限 stat -c '%a - %n' * else # 带参数时显示指定文件/文件夹权限 stat -c '%a - %n' "$@" fi }
把这段代码添加到你的~/.bashrc或者~/.bash_profile文件中,执行source ~/.bashrc(或重启终端)后就能正常使用:
- 直接输入
perms:显示当前目录所有项的权限 - 输入
perms file1 dir2:显示指定文件/目录的权限
为什么你的别名会失败
- 第一个别名里的
$(if [ -z '$@' ]; then *; else $@; fi)在定义时就执行了,此时$@是空值,*会被展开成当前目录的文件列表并赋值给a——但这是定义别名时的目录内容,不是执行perms时的内容,若定义时目录为空,a就会是空值,导致stat报错。 - 第二个别名里的
$1在定义时也是空值,a被赋值成字符串'*'(带引号),执行时stat会去找名为*的文件,自然找不到,因此提示参数错误。
内容的提问来源于stack exchange,提问作者J. Scott Elblein
相关产品推荐
相关产品推荐

