使用 -t 选项调用 bash

Har*_*don 2 bash

谁能告诉我-t调用 bash 时的选项?

我发现以下方便的命令可以使用轻量级终端窗口作为应用程序启动器

urxvt -geometry 80x3 -name 'bashrun' -e sh -c "/bin/bash -i -t"
Run Code Online (Sandbox Code Playgroud)

通过对其行为的一些调查,我发现-tbash 在执行一个命令后基本上会退出,但我很好奇该特定-t选项是否还有其他选项。我实际上找不到任何关于它的文档,我浏览了以下文档:

我觉得很奇怪,-t它不像其他选项那样清晰。

Joh*_*024 5

你是对的,它的记录非常糟糕。有什么文档很简单:

-t      Exit after reading and executing one command.
Run Code Online (Sandbox Code Playgroud)

bash 源代码可在此处获得。我看了4.2版。由 bash 处理的短标志列在flags.c相关行中:

{ 't', &just_one_command },
Run Code Online (Sandbox Code Playgroud)

因此,-t在命令行上设置变量just_one_command. 这个变量只用在一个地方:它出现在if循环结束时的条件中eval.c

  if (just_one_command)
    EOF_Reached = EOF;
Run Code Online (Sandbox Code Playgroud)

换句话说,如果-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);
}
Run Code Online (Sandbox Code Playgroud)

内部的循环reader_loop一直持续到它接收到信号EOF_Reached。该-t选项的唯一作用是在循环结束时设置此标志,以确保循环仅执行一次。


dev*_*ull 5

使用bashbuiltin help,即通过说help set,您会发现:

  -t  Exit after reading and executing one command.
Run Code Online (Sandbox Code Playgroud)

由于一次bash解析一行,因此您可能;在同一行上有多个由 分隔的命令,并且这些命令会执行。例如,以下内容:

set -t; echo Do something; echo do more; echo and more
echo no more
Run Code Online (Sandbox Code Playgroud)

会产生

Do something
do more
and more
Run Code Online (Sandbox Code Playgroud)

作为输出。另一方面,以下几点:

set -t
echo Do something
echo do more
echo and more
echo no more
Run Code Online (Sandbox Code Playgroud)

不会产生任何输出。


您可以在info页面中查找文档。说:

info bash "Shell Builtin Commands"
Run Code Online (Sandbox Code Playgroud)

导航到* Bourne Shell Builtins::并搜索help