Сценарий исполняемого файла, путь которого изменяется с обновлениями - PullRequest
0 голосов
/ 21 июня 2019

Я ищу способ найти 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.

1 Ответ

1 голос
/ 21 июня 2019

Это, вероятно, то, что вам нужно:

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'

чтобы получить метку времени и путь к файлу.

...