Как я могу условно передать подоболочку в течение 'времени'?

Bash имеет команды readline, которые не связываются по умолчанию. Можно найти их в ссылке: http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands

Команду, которую Вы ищете, называют "shell-backward-kill-word". Необходимо выбрать ярлык сначала. Давайте использовать Crtl+p, так как это - "предыдущая команда" - то же как стрелка вверх.

bind '"\C-p": shell-backward-kill-word'

9
18.12.2014, 00:39
2 ответа

Чтобы иметь возможность time подоболочки, вам понадобится ключевое слово time , а не команда.

Ключевое слово time , часть языка, распознается как таковое только при буквальном вводе и как первое слово команды (а в случае ksh93 , то следующий токен не начинается с - ). Даже ввод "время" не сработает, не говоря уже о $ TIME (вместо этого он будет воспринят как вызов команды time ).

Вы можете использовать здесь псевдонимы, которые раскрываются перед выполнением следующего цикла синтаксического анализа (чтобы позволить оболочке распознать это ключевое слово time ):

shopt -s expand_aliases
alias time_or_not=
TIMEFORMAT=%E

MEASURE_TIME=true
[[ $MEASURE_TIME = true ]] && alias time_or_not=time

time_or_not (apt-get update > /tmp/last.log 2>&1)

Ключевое слово time не принимает параметры (кроме -p в bash ), но формат может быть установлен с помощью переменной TIMEFORMAT в bash ]. (часть shopt также специфична для bash , другим оболочкам она обычно не нужна).

13
27.01.2020, 20:05

В то время как псевдоним - это один из способов сделать это, это можно сделать и с помощью eval - просто вы не очень хотите eval команду выполнение, как вы хотите, чтобы eval объявление команды .

Мне нравится псевдоним es - я использую их все время, но мне больше нравятся функции - особенно их способность обрабатывать параметры и то, что их не обязательно расширять в командной позиции, как это требуется для псевдоним es.

Я подумал, может быть, вы тоже захотите попробовать:

_time() if   set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
';      then set -- "$1" "$2" "$*"; unset IFS
             eval "$1 $TIME ${3#"$1"?"$2"?}"
        fi

Бит $ IFS в основном относится к $ * . Важно, чтобы (бит подоболочки) был также результатом расширения оболочки , поэтому для расширения аргументов в синтаксическую строку я использую «$ *» (кстати, не eval "$ @" , если вы не уверены, что все аргументы можно объединить в пробелах) . Разделитель-разделитель между аргументами в «$ *» является первым байтом в $ IFS , и поэтому может быть опасно продолжать работу без подтверждения его значения. Таким образом, функция сохраняет $ IFS , устанавливает его в \ n ewline, достаточно длинную, чтобы установить ... "$ *" в "$ 3" , unset s it, затем сбрасывает его значение, если оно было ранее.

Вот небольшая демонстрация:

TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
         'command -V time'                        \
         'hash time'                              \
      \) 'set +x'

Видите ли, я поместил туда две команды в значение $ TIME - можно любое число - даже никакое - но убедитесь, что оно экранировано и правильно заключено в кавычки - и то же самое касается аргументов _time () . Все они будут объединены в одну командную строку при выполнении - но каждый аргумент получает свою собственную \ n строку, поэтому их можно относительно легко распределить.Или вы можете объединить их все в одну, если хотите, и разделить их на \ n ewlines, или точку с запятой, или еще что-нибудь. Просто убедитесь, что один аргумент представляет команду, которую вы можете разместить в отдельной строке сценария при ее вызове. \ (, например, нормально, если в конечном итоге за ним следует \) . В основном нормальные вещи.

Когда eval получает приведенный выше фрагмент, он выглядит так:

+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'

И его результаты выглядят так ...

ВЫХОД

+++ echo any number of subshells
++ echo 'any number of subshells'
any number of subshells
++ command -V time
time is a shell keyword
++ hash time
bash: hash: time: not found

real    0m0.003s
user    0m0.000s
sys     0m0.000s
++ set +x

Ошибка хэша указывает что у меня нет установленной / usr / bin / time (потому что у меня ее нет) и команды дайте нам знать, сколько времени идет. Завершающий set + x - это еще одна команда, выполняемая после времени (что возможно) - важно быть осторожным с командами ввода, когда eval ничего.

3
27.01.2020, 20:05

Теги

Похожие вопросы