Изменить :Определил свою проблему благодаря комментарию steeldriver.
Запуск echo $pid | head -1
в bash
ничего не дает. Выполняя ту же команду в оболочке zsh
, я получаю именно то, что хочу.
вывод оболочки bash ->2590 18425 18449
вывод оболочки zsh ->2590
При этом моя проблема была решена путем изменения оболочки скрипта на #!/bin/zsh
.
Редактировать :Другим и более подходящим решением является просто использование echo $pid | awk '{print $1}'
вместо echo $pid | head -1
. Он работает на обеих оболочках. Благодаря комментарию Кристофера.
Это возможно в bash :, если последним символом определения псевдонима является пробел (или табуляция ), тогда bash также отменяет псевдоним следующего слова :
$ alias foo="echo "
$ alias bar="hello "
$ alias baz=world
$ foo bar baz
hello world
Ref:6.6 Псевдонимы в руководстве.
Таким образом, вы можете объединять псевдонимы :, но первое слово должно быть псевдонимом.
Я бы не стал использовать псевдонимы, хотя :это довольно тонко и, вероятно, ненадежно. Я бы использовал функцию, что-то вроде
gc() {
local -A translation=(
[cmp]=compute
[ins]=instances
[pdev]="--project=devproj-12891"
)
local -a args
for arg in "$@"; do
if [[ -v "translation[$arg]" ]]; then
args+=("${translation[$arg]}")
else
args+=("$arg")
fi
done
echo gcloud "${args[@]}"
}
Тогда
$ gc cmp ins list pdev
gcloud compute instances list --project=devproj-12891
Удалите echo
, если он выглядит хорошо.
Обновлен ярлык адреса "ci", добавлено 2 слова "compute" "instances":
Это особый случай, потому что мы хотим добавить к аргументам не один элемент в кавычках, а два. Позвольте мне переписать эту функцию для большей расширяемости:
gc() {
local -a args
for arg in "$@"; do
case $arg in
cmp) args+=( compute ) ;;
ins) args+=( instances ) ;;
ci) args+=( compute instances ) ;;
pdev) args+=( "--project=devproj-12891" );;
*) args+=( "$arg" ) ;;
esac
done
echo gcloud "${args[@]}"
}