在 bash 中同时使用“source”和“&”

在 bash 中同时使用“source”和“&”

我刚刚阅读了有关 Unix shell 如何工作(bash特别是)的内容,然后我尝试了一些对我来说没有意义的事情。

据我了解,该source命令在当前 shell 进程中运行您提供给它的程序,而不是分叉子进程。

另一方面,运行命令后,&在运行的进程完成之前将控制权返回给用户。如果你运行命令没有 source &,当前shell在子进程退出之前将控制权返回给用户。

但是当我创建一个名为的文件test.txthello world运行时:

source /bin/cat test.txt

… 我有-bash: ????: command not found

类似地,当我尝试使用以下方式加载我的虚拟环境时

source ./venv/bin/activate &

我刚刚得到了退出状态和进程 ID[1] 26489

发生了什么事?特别是第二条命令。我很困惑。

它是如何source工作的?与 一起使用时会发生什么&

答案1

source加载bash 脚本文件并在当前 shell 环境中对其进行解释。cat不是 bash 脚本,而是二进制程序文件,bash无法成功将其内容解释为脚本代码。除此之外,不是为使用而设计的 bash 脚本source可能会出现错误。

source filename [arguments]

filename在当前 shell 环境中从 读取并执行命令,并返回从 执行的最后一个命令的退出状态filename。 [...] 如果提供了任何参数,它们将成为执行 filename 时的位置参数。否则位置参数保持不变。返回状态是脚本中最后一个退出的命令的状态(如果没有执行任何命令,则返回 0),如果未找到filename或无法读取,则返回 false。

当你使用 运行它时&,它将在后台执行。任何状态更改只会在下次打印提示时显示,如下所示:

[1]+  Done                    source .bashrc

如果你真的想启动一个程序取代壳子,看一下exec

   exec [-cl] [-a name] [command [arguments]]
          If command is specified, it replaces the shell.  No new  process
          is  created.  The arguments become the arguments to command.  [...]

相关内容