编写shell脚本时,是仅运行程序的一种惯用法或快速方式 (如果已安装),如果未安装,则任其运行(或处理其他错误)除了安装之外)?
更具体地说,我有很多服务器可以通过ssh
访问,每当获得新服务器时,我都将所有rc文件复制到该服务器中。除非它已经运行,否则.zshrc将启动tmux
。某些服务器(并非全部)未安装tmux
。由于磁盘空间的限制,我不想安装它,我不想为不同的服务器使用不同的rc文件,并且我不希望我的rc文件在执行时被打断。
我已经看到了涉及apt-cache policy <package-name>
的解决方案,所以我想我可以使用它并将其通过管道传输到类似grep -e 'Installed: (none)'
的地方,但这可以假定服务器正在运行Debian或Ubuntu,但我不能这样做,并且仅适用于与apt
一起安装的软件包,不适用于我以其他方式安装的软件包。
答案 0 :(得分:1)
command -v <command>
是检查命令是否可以执行(在$PATH
上是可执行的)的常用(和POSIX)方法。
例如:
command -v tmux >/dev/null &&
tmux a -t name
({>/dev/null
,因为如果存在该命令,则其路径将被打印到STDOUT。)
最好将其放在可重用的函数中:
maybe() {
! command -v "${1}" >/dev/null ||
"$@"
}
然后可以使用:
maybe tmux a -t name
如果tmux
可用,则tmux a -t name
将运行,否则它将被忽略。
或者,如果您希望在命令不可用时得到一些反馈:
maybe() {
if command -v "${1}" >/dev/null
then
"$@"
else
printf 'Command "%s" not available, skipping\n' "${1}" >&2
fi
}
答案 1 :(得分:0)
这可能有帮助-
1)假设tmux在PATH中可用(因为它必须是可执行文件)
isAvailable=$(type -P tmux)
if [[ -x $isAvailable ]]; then
...
2)验证文件是否位于特定路径上(复制所有rc文件)
export FILEPATH="..."
if[[ -f $FILEPATH ]]; then