.file 在 bash 中执行文件,>file 清空文件内容

.file 在 bash 中执行文件,>file 清空文件内容

为什么. 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

相关内容