Команда не возвращает ожидаемое значение внутри .zshrc

См. Мой ответ на ваш предыдущий вопрос для получения информации о том, как передать аргументы в существующий сценарий. Анализировать вывод этого будет сложнее, чем предыдущего.

Намного проще написать новую версию скрипта. Подобный разбор дроссового словоблудия - одна из основных задач PITA.

Вот версия, которая делает это, а также не повторяет исходную ошибку печати лишнего вывода (например, заголовков).

#! /bin/bash

for i in "$@" ;  do
   printf "%i\t%i\t%i\n" $i $(($i * $i)) $(($i * $i *$i))
done

А вот версия, которая дополнительно печатает заголовок, если вы используете параметр -v (подробный):

#! /bin/bash

verbose=0

while getopts "v" opt ; do
  case "$opt" in
      v) verbose=1 ;;
   esac
done

shift "$((OPTIND-1))"

[ "$verbose" = "1" ] && printf "%s\t%s\t%s\n" 'Number' 'Squared' 'Power of 3'

for i in "$@" ;  do
   printf "%i\t%i\t%i\n" $i $(($i * $i)) $(($i * $i *$i))
done

2
19.06.2018, 22:06
1 ответ

В скорлупе,возвращаемое значение функции похоже на статус выхода команды :. Вы можете вернуть только небольшое целочисленное значение, указывающее на успех (0 )или код ошибки (> 0 ).

Этот статус никак не связан с выводом команды. Чтобы запустить команду и сохранить ее вывод в переменной, используйте подстановку команд . Чтобы запустить команду в функции и получить ее вывод как вывод функции, просто запустите команду.

function which_terminal {
    ps -p$PPID | awk "'NR==2'" | cut -d "' '" -f 11
}

Обратите внимание, что синтаксический анализ вывода psненадежен и излишен. (Кроме того, вы ошиблись :вы анализируете 'NR==2'в awkи ' 'в cut, оба из которых являются недопустимыми аргументами; вам нужны либо одинарные, либо двойные кавычки вокруг каждого из них, а не оба. )Команда psимеет опции для печати любого поля, которое вы хотите, например. commдля имени исполняемого файла (усеченного до 16 символов под Linux )или argsдля полной командной строки с аргументами (и иногда полного пути к команде, в зависимости от того, как она была вызвана ).

function which_terminal {
    ps -p$PPID -o comm=
}

Или, чтобы сохранить вывод в переменную:

parent_process_command=$(ps -p$PPID -o comm=)

Причина ошибки, которую вы получаете, заключается в том, что zsh пытается проанализировать следующее returnв качестве аргумента команды (здесь это аргумент ключевого слова return, но они анализируются в так же ). Он видит открытую скобку и решает, что это начало выражения с подстановочным знаком. Это подстановочное выражение будет соответствовать файлу с именем ps -p16632, awk 'NR==2'илиcut -d -f 11(с начальными/конечными пробелами, которые здесь не отображаются ), но поскольку у вас (, что неудивительно ), нет файлов с любым из эти имена, zsh жалуется, что не нашел совпадения. return ?вернет 3, если у вас есть файл с именем 3в текущем каталоге и нет другого файла с именем из одного символа -.

2
27.01.2020, 22:09

Теги

Похожие вопросы