zsh 的 -i 选项实际上有什么作用?

zsh 的 -i 选项实际上有什么作用?

zsh手册页:

   -c     Take the first argument as a command to execute, rather than reading commands  from  a  script  or  standard
          input.   If  any  further  arguments are given, the first one is assigned to $0, rather than being used as a
          positional parameter.

   -i     Force shell to be interactive.  It is still possible to specify a script to execute.

   -s     Force shell to read commands from the standard input.  If the -s flag is not  present  and  an  argument  is
          given, the first argument is taken to be the pathname of a script to execute.

据我所知,除非与, 一起使用以强制来源-i,否则没有任何效果。如果没有,默认情况下似乎是交互式的。-czsh~/.zshrc-czsh

所以:

  • zsh和之间有什么区别吗zsh -i
  • zsh -s和之间有什么区别吗zsh -s -i
  • -i如果-c不在场会做些什么吗?

答案1

这里的混乱源于对成为一个人意味着什么的误解。交互的壳。

AZ shell 不是交互式的,只是因为它恰好运行提示-读取-执行循环。一个人可以拥有一个外壳,不是交互式运行提示-读取-执行循环,从文件或管道读取其命令。 cat | zsh正是如此。

如果 AZ shell 没有要运行的命令或脚本,则它是交互式的(即它会进入提示-读取-执行循环)它的标准输入是终端。这是shell程序在启动时做出的决定。很多事情都是受到影响该决定和是的后果它,例如要处理哪些启动文件以及最初的$-shell 变量和shell 选项的值interactive。请参阅手册了解“交互式 shell 中”发生的所有各种情况。

不同 shell 在使用的​​确切规则上存在一些非常细微的差异。有些(例如这里的 Z shell)仅测试标准输入以查看它是否是终端。 Single UNIX 规范指出应该检查标准输入和标准错误。 zsh 2>&1 | cat生成交互式 Z shell,但ksh 2>&1 | cat会生成非交互式 Korn shell。

Z壳决定是否进入提示-读取-执行循环、运行命令或执行脚本。这是一个分离决策,其结果反馈到 am-I-interactive 决策中。 三个选择都可以通过使用该选项,可以是交互式的或非交互式的-i

-i选项只是强制 shell 认为它是交互式的一种方式,即使它的标准输入不是终端,或者它被赋予要运行的命令或脚本。使用管道来证明这一点有点棘手,例如cat | zsh -i因为 ZLE 会导致一些奇怪的行为(更多信息请参见https://unix.stackexchange.com/a/434839/5132)使水有点浑浊。但您可以看到它ksh -i 2>&1 | cat生成了一个交互式 Korn shell。

-s选项同样存在以覆盖其他(做什么)决定,基于当未覆盖第一个参数的存在时,执行脚本而不是运行提示-读取-执行循环。该-c选项也会影响其他决定。

  • zsh wibble尝试执行脚本,因此是非交互式的。
  • zsh -s wibble不尝试执行脚本,而是强制“做什么”决策选择进入“提示-读取-执行”循环,并且(当标准输入是终端时)是交互式的。
  • zsh -c wibble是非交互式的,因为它正在运行命令。

从这里开始,这些组合就按逻辑出现了。

  • zsh -si wibble仍然(同样)是交互式的,覆盖强制 am-I-interactive 决策的方式与无论如何都相同(因为-s强制选择进入提示-读取-执行循环)。
  • zsh -i wibble尝试执行脚本,但脚本(如果看起来)会认为它是交互式 shell,并且当 Z shell 到达脚本末尾时将发生交互式 EOF 行为。
  • zsh -ci wibble仍然运行命令,但如果该命令看起来(如果它是内置函数或 shell 函数),它会认为它是交互式 shell。

……有两个例外:

  • zsh -cs wibble在认为它是非交互式的 shell 中运行命令。
  • zsh -csi wibble同样,在认为它是交互式的 shell 中运行命令。

-c有效地覆盖-s. (Microsoft/IBM/JPSoftware 命令解释器有一个/K运行命令的选项然后进入提示-读取-执行循环。这将是-c和的逻辑组合-s,但在 Unix shell 世界中从未这样做过。)

相关内容