Linux中的source命令

Linux中的source命令

我的问题是:
为什么如果我运行一些带有名称别名的文件,例如包含如下内容:

alias lsa="ls -a" 

直接地:

$ ./aliases

它不会创建别名(可能仅在脚本上下文中)。
但如果我使用命令“source”运行它:

$ source aliases

它能工作吗?我的意思是执行后别名“lsa”是否存在于命令 shell 上下文中?
“man source”给出:“没有手动输入源”,在 google 中我发现它运行 Tcl,但为什么 Tcl 影响 shell 上下文而 bush 不影响呢?

答案1

基本上是因为当你运行的时候./aliases,它会创建一个你的别名存在但之后立即结束的进程,而当你运行source它时,它会应用于你当前的 bash 进程。

要获取 的帮助source,您需要阅读man bash。为了省去您的麻烦:

source filename [arguments]
    Read and execute commands from filename in the current shell environment
    and return the exit status of the last command executed from filename.
    If filename does not contain a slash, file names in PATH are used to find
    the directory containing filename. The file searched for in PATH need not
    be executable. When bash is not in posix mode, the current directory is
    searched if no file is found in PATH. If the sourcepath option to the shopt
    builtin command is turned off, the PATH is not searched. If any arguments
    are supplied, they become the positional parameters when filename is
    executed. Otherwise the positional parameters are unchanged. The return
    status is the status of the last command exited within the script (0 if
    no commands are executed), and false if filename is not found or cannot
    be read.

答案2

当您将其作为可执行脚本运行时,shell 会将其自身的副本作为子进程来运行该脚本。这意味着对别名的任何更改:

  • 只会被那个孩子看到。
  • 一旦孩子离开就会消失。

相比之下,当你source使用脚本时:

  • 它在同一个进程中运行(就像你只是输入了它的内容一样)
  • 对别名的更改将被保留。

相关内容