См. Мой ответ на ваш предыдущий вопрос для получения информации о том, как передать аргументы в существующий сценарий. Анализировать вывод этого будет сложнее, чем предыдущего.
Намного проще написать новую версию скрипта. Подобный разбор дроссового словоблудия - одна из основных задач 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
В скорлупе,возвращаемое значение функции похоже на статус выхода команды :. Вы можете вернуть только небольшое целочисленное значение, указывающее на успех (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
в текущем каталоге и нет другого файла с именем из одного символа -.