Что относительно этого:
foo=`{ { cat 1>&3; kill 0; } | { sleep 2; kill 0; } } 3>&1`
Это: выполните производящую вывод команду и sleep
в той же группе процесса, группе процесса только для них. Какой бы ни команда возвращается, сначала уничтожает целую группу процесса.
Был бы любой задаваться вопросом: Да, канал не используется; это обошло использование перенаправлений. Единственная цель его состоит в том, чтобы иметь оболочку, выполняет эти два процесса в той же группе процесса.
Как Gilles указал в своем комментарии, это не будет работать в сценарии оболочки, потому что процесс сценария был бы уничтожен наряду с двумя подпроцессами.
Один путь ¹, чтобы вынудить команду работать в отдельной группе процесса состоит в том, чтобы запустить новую интерактивную оболочку:
#!/bin/sh
foo=`sh -ic '{ cat 1>&3; kill 0; } | { sleep 2; kill 0; }' 3>&1 2>/dev/null`
[ -n "$foo" ] && echo got: "$foo" || echo timeouted
Но могли бы быть протесты с этим (например, когда stdin не является tty?). stderr перенаправление там для избавлений от "Завершенного" сообщения, когда интерактивная оболочка уничтожается.
Протестированный с zsh
,bash
и dash
. Но что относительно старых произведений?
B98 предлагает, чтобы следующее изменение, работающее над Mac OS X, с GNU, колотило 3.2.57, или Linux с тире:
foo=`sh -ic 'exec 3>&1 2>/dev/null; { cat 1>&3; kill 0; } | { sleep 2; kill 0; }'`
–
1. кроме setsid
который, кажется, нестандартен.
В системах Linux можно обычно находить большое количество сценариев в качестве примера под: /etc/bash_completion.d
. Если Вы получите эти сценарии, то Вы получите поведение автоматического заполнения.
Я включал пример из того каталога. Это - сценарий завершения для unrar.
_unrar()
{
local cur
COMPREPLY=()
_get_comp_words_by_ref cur
if [[ "$cur" == -* ]] ; then
COMPREPLY=( $( compgen -W '-ad -ap -av- -c- -cfg- -cl -cu \
-dh -ep -f -idp -ierr -inul -kb -o+ -o- -ow -p -p- -r -ta \
-tb -tn -to -u -v -ver -vp -x -x@ -y' -- "$cur" ) )
else
if [ $COMP_CWORD -eq 1 ]; then
COMPREPLY=( $( compgen -W 'e l lb lt p t v vb vt x' -- "$cur" ) )
else
_filedir '@(rar|RAR)'
fi
fi
} &&
complete -F _unrar -o filenames unrar
Эта функциональность имеет нуль, чтобы сделать с Python. Это - чистая функциональность базовой оболочки. Таким образом прочитайте документы удара об автозавершении.
Google для "автозавершения удара" и Вы найдете по крайней мере 5 разумных документов при первых 10 хитах.