Я пытаюсь выбрать часть какого-либо вывода в Bash, но не могу понять, где разместить фильтр, и меня не устраивает вывод, который я получаю.
Я начинаю с
declare -a pythons=("python" "python2" "python3")
for p in "${pythons[@]}"
do
echo "$p: $($p --version 2>&1) in $(which $p)" && for i in $(which -a $p); do echo " $i ($($i --version 2>&1))"; done && echo;
done
, которая годами работала для получения ожидаемого результата, а именно
python: Python 2.7.15 in /usr/local/bin/python
/usr/local/bin/python (Python 2.7.15)
/usr/bin/python (Python 2.7.10)
python2: Python 2.7.15 in /usr/local/bin/python2
/usr/local/bin/python2 (Python 2.7.15)
python3: Python 3.7.0 in /usr/local/bin/python3
/usr/local/bin/python3 (Python 3.7.0)
но теперь выдает
python3: Python 3.7.0 (default, Jun 29 2018, 20:13:13)
[Clang 9.1.0 (clang-902.0.39.2)] in /usr/local/bin/python3
/usr/local/bin/python3 (Python 3.7.0 (default, Jun 29 2018, 20:13:13)
[Clang 9.1.0 (clang-902.0.39.2)])
для окончательной группировки.
Я подумал, что мог бы просто исправить это, добавив egrep -o 'Python\s[0-9\\.]+'
сразу после каждого python --version
с
for p in "${pythons[@]}"
do
echo "$p: $($p --version | egrep -o 'Python\s[0-9\\.]+' 2>&1) in $(which $p)" && for i in $(which -a $p); do echo " $i ($($i --version | egrep -o 'Python\s[0-9\\.]+' 2>&1))"; done && echo;
done
но меня это удивляет, когда я вытаскиваю версии Python 2 на отдельной строке перед строками, где я ожидаю этого
Python 2.7.15
python: in /usr/local/bin/python
Python 2.7.15
/usr/local/bin/python ()
Python 2.7.10
/usr/bin/python ()
Python 2.7.15
python2: in /usr/local/bin/python2
Python 2.7.15
/usr/local/bin/python2 ()
python3: Python 3.7.0 in /usr/local/bin/python3
/usr/local/bin/python3 (Python 3.7.0)
Я думаю, что полностью потерял ориентир в отношении того, куда отправляется вывод, и мне нужна помощь, чтобы разобраться, где я делаю свою - возможно, очень простую - ошибку сценария Bash.