为什么. file
在 bash 中使用 会执行一个文件,即使它不是可执行文件? 是因为它使用当前 bash 会话来运行它,所以它的工作方式就像键入 一样bash file
?
另外,类似地。我知道输入> file
会删除文件的内容。但为什么呢?我知道这会将标准输入发送到文件。但标准输入不是键盘吗?那么理论上我不应该转到新行并输入内容吗?我不明白。
答案1
首先,它. file
不会执行文件,而是获取文件。这听起来可能有点迂腐,但两者之间有一个重要的区别。执行文件时,它会在其自己的子 shell 中运行;例如,其中定义的任何变量都不会传播到父会话。为了说明这一点,请考虑这个脚本 ( foo.sh
),它只是设置一个变量,然后打印它:
foo="bar"
echo "In the script, foo is $foo"
现在,让我们将变量设置foo
为某个值,然后运行该脚本,一旦完成,echo $foo
:
$ foo="baz"
$ bash foo.sh
In the script, foo is bar
$ echo $foo
baz
如您所见,$foo
已在脚本中设置,但并未改变父 shell 中变量的值。将上述内容与我们改为执行脚本时发生的情况进行对比:
$ . foo.sh
In the script, foo is bar
$ echo $foo
bar
这次,由于脚本是源脚本,因此变量在父 shell 中也发生了变化。
更> file
简单。>
操作员打开一个文件(如果不存在则创建它)进行写入,并立即覆盖文件中已有的任何内容。因此,如果您只运行> file
而不执行任何其他操作,>
则将清空文件(如果存在)。
答案2
避免在同一篇文章中提出两个不相关的问题。
1:它并不完全像 那样工作,bash file
因为后者运行一个新的 shell,而.
使用相同的当前 shell。它的工作原理是source file
。
2:默认标准输入通常确实是键盘,但运行 时> file
,没有要运行的命令。shell 只处理重定向,然后结束处理(缺失的)命令。您描述的应该是cat > file
。