Intereting Posts
Использование awk для определения максимального значения в нескольких подмножествах данных внутри файла sed: исключая строки серверной части из сопоставленного шаблона Мышь продолжает «перетаскивание» или «выделение» после отпускания левой кнопки Получение конкретной линии с вывода терминала Ошибка Strate bash sytax в зависимости от использования sudo Acpid работает, когда работает с правами root, но не при запуске systemd Как использовать переменные среды Monit? Разделение выходного изображения ddrescue на 2 файла Как использовать драйверы слияния Git с Jenkins Расширение Bash $ {@} как команда флаги ext4, чтобы указать режим «экстентов»? Как разрешить сообщение «… система не поддерживает поддержку моментального снимка»? find in / sys / class не показывает все, почему? «Доступ запрещен» при входе в виртуальную машину Solaris с использованием ssh Что такое контейнер Linux и гипервизор Linux?

вызов bash с опцией -t

Может ли кто-нибудь рассказать мне о опции -t при вызове bash?

Я нашел следующую удобную команду для использования облегченного терминального окна в качестве запуска приложения

 urxvt -geometry 80x3 -name 'bashrun' -e sh -c "/bin/bash -i -t" 

Посредством небольшого исследования его поведения я вижу, что -t существу делает выход bash после выполнения одной команды, но мне любопытно, есть ли еще какая-то опция -t . Я не могу найти документацию об этом, и я просмотрел следующие документы:

  • man bash
  • Вызов Bash
  • стандартные варианты bash

Мне показалось странным, что – это не так ясно изложено, как остальные варианты.

Вы правы, что это удивительно плохо документировано. Какая документация там достаточно проста:

 -t Exit after reading and executing one command. 

Исходный код bash доступен здесь . Я посмотрел версию 4.2. Короткие флаги, обработанные bash, перечислены в flags.c и в нем есть соответствующая строка:

 { 't', &just_one_command }, 

Итак, -t в командной строке задает переменную just_one_command . Эта переменная используется только в одном месте: она встречается в if в конце цикла в eval.c :

  if (just_one_command) EOF_Reached = EOF; 

Другими словами, если задан флаг -t , то после выполнения первой команды условие конца файла сигнализируется и bash .

БОЛЕЕ ДЕТАЛЬНО

Из eval.c командной строки в bash , по-видимому, контролируется функцией reader_loop :

 reader_loop () { int our_indirection_level; COMMAND * volatile current_command; USE_VAR(current_command); current_command = (COMMAND *)NULL; our_indirection_level = ++indirection_level; while (EOF_Reached == 0) { int code; code = setjmp_nosigs (top_level); [ ... Much code removed ... ] if (just_one_command) EOF_Reached = EOF; } indirection_level--; return (last_command_exit_value); } 

Цикл внутри reader_loop продолжается до тех пор, пока не получит сигнал EOF_Reached . Единственным эффектом опции -t является установка этого флага в конце цикла, который гарантирует, что цикл выполняется только один раз.

Это объясняется на странице руководства, просто трудно найти.

Параметры, не упомянутые в блоке «ОПЦИИ» в начале, являются параметрами для set которые также могут быть заданы как параметры для bash:

Параметры также могут быть указаны как аргументы для вызова оболочки.

 -t Exit after reading and executing one command. 

Используя встроенную help bash , то есть, произнеся help set , вы найдете:

  -t Exit after reading and executing one command. 

Поскольку bash анализирует строку за раз, вы можете иметь несколько команд, разделенных ; в той же строке, и они будут выполняться. Например, следующее:

 set -t; echo Do something; echo do more; echo and more echo no more 

будет производить

 Do something do more and more 

как выход. С другой стороны, следующее:

 set -t echo Do something echo do more echo and more echo no more 

не будет производить никакой продукции.


Вы можете найти документацию на info странице. Сказать:

 info bash "Shell Builtin Commands" 

Перейдите к * Bourne Shell Builtins:: и найдите help .