如何查看触发bash函数的执行命令?自定义hash函数调用报错求解
问题排查与解决方案
如何查看实际触发的命令
有两种常用方法:
- 执行命令前开启Bash调试模式,运行
set -x && sha256 hello && set +x,控制台会输出所有变量替换完成后的实际执行指令。 - 临时修改
hash函数,增加打印语句输出拼接后的命令:
修改后运行hash() { echo "实际执行的Python命令:python3 -c \"import hashlib; print(hashlib.$0('$1').hexdigest())\"" python3 -c "import hashlib; print(hashlib.$0($1).hexdigest())" }source ~/.bashrc加载配置,再执行sha256 hello就能看到完整的运行命令。
报错原因
Bash 内置变量$0的含义是当前运行的Shell程序名称,你当前环境运行的是bash,所以$0的值固定为bash,代入Python代码后会尝试调用hashlib.bash(),自然触发属性不存在的报错,你的写法错把$0当成了函数/别名的调用名称。
修复方案
方案1:调整别名与函数逻辑(改动最小,推荐)
修改别名主动把算法名作为参数传给hash函数,同时调整函数的参数取值逻辑:
hash() { # 第一个参数是哈希算法名,第二个参数是待计算的字符串 python3 -c "import hashlib; print(hashlib.$1(b'$2').hexdigest())" } # 别名改为带算法参数调用hash函数 alias sha256='hash sha256' alias md5='hash md5' alias sha1='hash sha1' alias sha512='hash sha512'
修改完成后运行source ~/.bashrc加载配置即可正常使用。
方案2:批量生成独立函数(无需别名)
如果不想依赖别名,可以直接循环生成所有算法的独立命令:
for algo in sha256 md5 sha1 sha512; do eval "$algo() { python3 -c \"import hashlib; print(hashlib.$algo(b'\$1').hexdigest())\"; }" done
将上述代码写入.bashrc后加载,即可直接使用sha256 hello这类命令。
内容的提问来源于stack exchange,提问作者bash that bin
相关产品推荐
相关产品推荐

