首页 > 解决方案 > 编写路径随更新而更改的可执行文件

问题描述

我正在寻找一种方法来找到pg_dump改变其路径的更新。pg_dump这是我crontabs的自动备份的两个最新版本:

/usr/local/Cellar/postgresql@10/10.6_2/bin/pg_dump
/usr/local/Cellar/postgresql@10/10.8/bin/pg_dump

当脚本简单地调用时pg_dump,它找不到,所以至少必须$PATH在脚本本身中导出它。同样的问题。

有没有办法pg_dump在脚本运行时嗅探哪里?

有没有更好的方法在仍在使用的同时完成这项工作pg_dump

顺便说一句,我正在使用Mac OS,其realpath似乎不起作用。它指向一个/Users/rich/pg_dump不存在的假货。

刚刚尝试了以下操作,日志的输出为空:

c1=$(which pg_dump)
echo $c1
eval $c1

这在以我自己的用户身份运行时有效,但我不确定 crontabs 的用户是谁。

标签: bashpathcronhomebrew

解决方案


这可能是您需要的:

pg_dump_path=$(find -L '/usr/local/Cellar/postgresql@10' -type f -name 'pg_dump' -printf '%T@\t%f\n' | sort -nr | head -1 | cut -f2-)

[[ -x "$pg_dump_path" ]] || {printf 'Failed to find pg_dump.\n' >&2; exit 1}

pg_dump_bin="${pg_dump_path%/*}"

echo "$pg_dump_bin"
echo "$pg_dump_path"

我正在对 sort/head/cut 进行管道处理,以确保您只获得 1 个结果,即该工具的最新安装版本。如果这不是您所需要的,那么更新您的问题以澄清。

如果您的版本find不支持-printf,那么您可以使用:

-exec stat -f $'%a\t%N' {} \;

代替:

-printf '%T@\t%f\n'

获取文件的时间戳和路径。


推荐阅读