提问人:f1fan44 提问时间:11/17/2023 最后编辑:f1fan44 更新时间:11/17/2023 访问量:33
以 sudo [duplicate] 身份执行脚本时找不到 bash 内置命令 compgen
bash built-in command compgen is not found when executing a script as sudo [duplicate]
问:
我的目录中有一组压缩包。我想选择压缩包的“最大”名称(即以相反顺序排序时的第一个名称)并在 bash 脚本变量中捕获该名称。我的示例文件是:
goyard@GoYard-BOXER-6404:~/Code/NodejsServer$ ls
reports-1.0.0.tgz reports-1.1.0.tgz reports-2.tgz
在这种情况下,“reports-2.tgz”是我想要的文件。
在 bash 命令行中,这工作正常:
goyard@GoYard-BOXER-6404:~/Code/NodejsServer$ tarball_path=`compgen -G "report*.tgz" | sort -r | head -n 1`
goyard@GoYard-BOXER-6404:~/Code/NodejsServer$ echo $tarball_path
reports-2.tgz
在 bash shellscript 中,相同的命令成功:
脚本:
# !/bin/bash
tarball_path=`compgen -G "report*.tgz" | sort -r | head -n 1`
echo "tarball_path: ${tarball_path}"
脚本输出:
goyard@GoYard-BOXER-6404:~/Code/NodejsServer$ ./get_report_name.sh
tarball_path: reports-2.tgz
但是当我使用 sudo 执行脚本时,找不到 compgen 内置命令:
goyard@GoYard-BOXER-6404:~/Code/NodejsServer$ sudo ./get_report_name.sh
[sudo] password for goyard:
./get_report_name.sh: 1: compgen: not found
tarball_path:
我需要使用 sudo,因为我最终会将这个 tarball 提取到我的 Ubuntu 盒子上的 /srv 目录中。
注意:这似乎不是使用 bash -e 选项的问题,因为 compgen 命令内置于 bash - 未传入。
为什么 sudo 在这里有所作为?
...我该如何纠正这个问题?
答: 暂无答案
评论
#!/bin/bash
lastMatch() { local val="${@:$#}"; if [[ -e $val || -L $val ]]; then printf '%s\n' "$val"; else return 1; fi; }
tarball_path=$(lastMatch report*.tgz)
# !/bin/bash
#!/bin/bash
sh
compgen
echo -e
在 ubuntu 上由 root 在脚本中运行时的行为不同,以了解具有相同根本原因的不同问题(也就是说,由没有有效 shebang 的脚本运行,而不是在 Ubuntu 上启动时)。sh
bash
sudo