Фильтрация с помощью `egrep` в сложном выражении Bash, сообщающем версию Python - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь выбрать часть какого-либо вывода в 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.

1 Ответ

0 голосов
/ 01 сентября 2018

Кажется, проблема связана с тем, что вы сместили позицию 2>&1 вправо от grep. Используйте это:

for p in "${pythons[@]}"
do
   echo "$p: $($p --version 2>&1 | egrep -o 'Python\s[0-9\\.]+') in $(which $p)" && for i in $(which -a $p); do echo "    $i ($($i --version 2>&1 | egrep -o 'Python\s[0-9\\.]+'))"; done && echo; 
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...