#bash #shell
Вопрос:
Я использую этот ответ, чтобы сравнить минимальный номер версии, который требуется. Но прежде чем я перейду к сравнению, я на самом деле застрял на том, как извлечь номер версии.
Мой текущий сценарий выглядит так
#!/usr/bin/env bash
x=`pgsync -v`
echo "---"
echo $x
и его выход-это
> ./version-test.sh
0.6.7
---
Я также пробовал, x="$(pgsync -v)"
и я все еще получаю пустую строку. Что я здесь делаю не так?
Комментарии:
1. Для этого и существуют менеджеры пакетов. Не тестируйте его во время выполнения; пусть он выйдет из строя, если вы не установили его должным образом.
2. Похоже
pgsync -v
на запись в стандартную ошибку, а не в стандартный вывод. Вероятно, потребуется некоторое перенаправление.3. Не уверен, что
> /dev/null
это необходимо.4. Посмотрев на выходные данные вашего скрипта, которые вы предоставили. Вывод pgsync, появившийся над черточками, был большим намеком.
5. @EmAe — не зная, что искать (согласно комментарию Шона) …
pgsync -v 2>stderr.txt >stdout.txt
а затем посмотрите, какой файл содержит какие выходные данные
Ответ №1:
Если вы пытаетесь записать вывод команды в переменную, а вместо этого он выводится на терминал, это признак того, что команда записывает не в свой стандартный вывод, а в другой поток — обычно стандартная ошибка. Так что просто перенаправьте его:
x=$(pgsync -v 2>amp;1)
Кроме того, запись явно запрошенного номера версии в стандартную ошибку вместо стандартного вывода противоречит интуиции и, возможно, является ошибкой.
Кроме того, предпочитайте $()
замену команд обратным указателям; подробности см. в разделе Часто задаваемые вопросы Bash 082.