Вы можете поместить процесс (или несколько процессов) в фоновом режиме с помощью &
, а затем в дальнейшем в вашем сценарии вы можете подождать, пока они все не закончатся, используя команду bash builtin wait
. Вот это реклама от man bash
:
wait [-n] [n ...]
Wait for each specified child process and return its termination
status. Each n may be a process ID or a job specification; if a
job spec is given, all processes in that job's pipeline are
waited for. If n is not given, all currently active child pro‐
cesses are waited for, and the return status is zero. If the -n
option is supplied, wait waits for any job to terminate and
returns its exit status. If n specifies a non-existent process
or job, the return status is 127. Otherwise, the return status
is the exit status of the last process or job waited for.
Проверка статуса возврата wait
для конкретного задания может обеспечить "в случае успеха" проверку, что &&
делает, как и в этом тестовом сценарии:
#!/bin/bash
sleep 3 &
s3pid=$!
true &
trpid=$!
false &
fapid=$!
echo "Expecting success next, since true returns 0"
wait $trpid && echo "wait process true success" || echo "wait process true FAIL"
echo "Expecting FAIL next, since false returns 1"
wait $fapid && echo "wait process false success" || echo "wait process false FAIL"
echo "Expecting success next, since wait alone always returns 0"
wait && echo "wait for all success" || echo "wait for all FAIL"
Но только для одной команды, использование &&
будет таким же.... А в случае с запросом, если вы запускаете программу типа демона "никогда не останавливаться", она не будет завершена, и вам не нужно &&
или ждать
Скобки (которые по определению являются «кудрявыми») в этом контексте относятся к списку фрагментов текста, разделенных запятыми. Хотя он чаще всего используется для имен файлов, он расширяется перед обработкой расширений имен файлов. Поэтому нет возможности окончательного расширения, поскольку bash
не может знать, действительно ли вы вводите имя файла или нет.
Существует два способа интерпретации вопроса: вы хотите завершить, пока вы вводите имена перед закрытием }
(фактически делать завершения файлов в другом каталоге); или необходимо развернуть и заменить (допустимые) имена после закрытия }
. {}
расширяет все опции, в отличие от globbing, который расширяет существующие имена файлов, хотя использует «», а не космос.
При использовании bash ожидаемым способом создания списка слов является {}
:
cp ~/html/{foo,bar.txt,whatever} ...
Существует два варианта: связывание привязки клавиши readline с функцией оболочки или программируемое завершение.
Подход readline дает вам свободную руку, чтобы полностью переписать текущую команду, но проблема в том, что она не маркирует текущую командную строку, поэтому у вас есть нетривиальная проблема синтаксического анализа.
Программируемое завершение маркирует командную строку, но можно только изменить/заменить текущее слово, что означает, что невозможно (легко) сохранить префикс path/{
во время редактирования.
Единственной связанной встроенной функцией bash является функция readline
shell-expand-line
для bash, которая предназначена для выполнения «всех расширений слова shell». По умолчанию она привязана к \M-\C-e
(Esc \C-e
). Можно разумно ожидать, что это расширение будет все из семи типов расширения, указанных на странице man (bash-4.3):
Расширение выполняется в командной строке после его разделения на слова. Существует семь видов расширения: расширение раскосов, расширение тильды, параметр и переменное расширение, командует substitu ‐ тион, арифметическое расширение, разделение слов и расширение пути.
Вы можете поэкспериментировать с помощью ввода (без нажатия кнопки Return)
echo {1..2} ~root $0 $LANG `echo foo` $((1+2) "a b" /etc/p[aeiou]*
, а затем Meta Ctrl E (или ESC + Ctrl E , если вы используете мета-дефибрированную клавиатуру).
Ни первое, ни последнее (скобка и путь) расширения не работают для меня, поэтому документация и реализация не вполне соответствуют IMHO.
Ниже приведено не полное, а рабочее решение с использованием вкладки для расширения. Необходимо убедиться, что используется правильный синтаксис для раскоса, хотя, в частности, с запятой, чтобы разделить элементы, а не космос.
function _expand() {
[[ -z "${READLINE_LINE}" ]] && return
eval local aa=( ${READLINE_LINE} ) # not-quoted, eval needed
[[ ${#aa} -eq 0 ]] && return # parse problem
printf -v READLINE_LINE "%s " "${aa[@]}"
READLINE_POINT=${#READLINE_LINE} # eol, predictable at least
}
bind -x '"\C-_":_expand'
При этом Ctrl _ связывается с функцией bash, которая использует eval
для заполнения массива, вызывая все обычные расширения (как описано выше, и не включая историю),а затем перестраивает командную строку.
Начните ввод, нажмите Ctrl _ , когда вы хотите что-то развернуть, и Вернитесь , как обычно, когда будете готовы.
Это более мощное, чем tab, но менее точное, поскольку оно расширяет всю входную строку. Есть несколько случаев, когда это не расширится, как надеялись, в частности, когда различные метасимволы оболочки путают простую логику оценки
.
Предложение Гилле zsh
стоит посмотреть, а не сверхинженерное решение.
Насколько я знаю, вы можете использовать USB wifi устройства только для aircrack-ng, если вы используете его в виртуальной машине. Если вы хотите использовать внутреннюю карту Wi-Fi, попробуйте ее с живой версией backtrack
Приветствия