Используйте сопроцесс . Используя встроенный coproc
, вы можете запустить подпроцесс, прочитать его вывод и проверить его статус выхода:
coproc LS { ls existingdir; }
LS_PID_=$LS_PID
while IFS= read i; do echo "$i"; done <&"$LS"
wait "$LS_PID_"; echo $?
Если каталог не существует, wait
выйдет с ненулевым статусом код.
В настоящее время необходимо скопировать PID в другую переменную, потому что $ LS_PID
будет сброшен до вызова wait
. См. Bash сбрасывает переменную * _PID, прежде чем я смогу дождаться coproc , чтобы узнать подробности.
После установки этого инструмента вы можете сделать это следующим образом:
В~/.bash_profile
:
alias sctl='systemctl'
В~/.bash_completion
:
complete -F _complete_alias sctl
Введите sctl <tab>
для отображения команд systemctl
:
$ sctl <Tab>
add-requires
add-wants
cancel
cat
condreload
...
Я взломал это, чтобы завершение также работало для systemctl+args. Я скопировал некоторые части исходного кода дополнения bash -для systemctl, чтобы управлять этим (/usr/share/bash -завершением/завершением/systemctl ).
alias ssr='sudo systemctl restart'
alias sss='sudo systemctl status'
alias ssp='sudo systemctl stop'
# Load necessary functions in bash-completion's source code for systemctl (get_*_units)
source /usr/share/bash-completion/completions/systemctl
# Manually recreate some functions
_systemctl_status()
{
comps=$( __get_non_template_units --system "${COMP_WORDS[1]}" )
compopt -o filenames
COMPREPLY=( $(compgen -o filenames -W '$comps') )
return 0
}
_systemctl_restart()
{
comps=$( __get_restartable_units --system "${COMP_WORDS[1]}" )
compopt -o filenames
COMPREPLY=( $(compgen -o filenames -W '$comps') )
return 0
}
_systemctl_stop()
{
comps=$( __get_stoppable_units --system "${COMP_WORDS[1]}" )
compopt -o filenames
COMPREPLY=( $(compgen -o filenames -W '$comps') )
return 0
}
complete -F _systemctl_restart ssr
complete -F _systemctl_status sss
complete -F _systemctl_stop ssp
Это можно легко расширить для других команд systemctl, просто найдите нужную команду get _*_unit в исходном файле и скопируйте мои примеры.
Я также пытался изменить массив $COMP _WORDS, чтобы получить какое-то общее решение, работающее для всех команд, но безрезультатно.