“无法覆盖现有文件”来自“echo content >file.sh”

Mjo*_*eph 3 linux shell

我是 Linux 新手,仍在尝试理解基本命令。我的老师刚刚给了我们一些练习,让我们尝试自己完成 - 其中之一是创建一个名为 hello.sh 的文件并向其中添加几行文本。为此,我将以下代码写入 MobaXterm 中:

touch hello.sh
echo "Hello $LOGNAME\!" > hello.sh
Run Code Online (Sandbox Code Playgroud)

然后我还想添加一些其他回显命令,但在输入第一个“回显”命令后,我的终端立即显示

-bash: hello.sh: 无法覆盖现有文件

这里发生了什么?我对 .txt 文件做了类似的事情,它似乎有效。问题是由于文件类型引起的还是我只是搞乱了命令?(另外,如果我使用了错误的标签,我很抱歉 - 不确定什么最适合这个问题。)

谢谢你的帮助!

Pau*_*ges 6

noclobber我经常在脚本中使用该选项。它更改了 的默认行为>,通常会截断已存在的文件,以执行您所看到的操作。它仍然会创建一个新文件,但不会破坏现有内容。

要添加到现有文件,请使用>>. 如果您截断包含预先存在内容的文件,请使用>|. 即使已noclobber设置,这些始终有效。如果文件尚不存在,两者也会创建一个新文件。

touch创建了一个空文件,因此noclobber不会让您写入它,因为它已经存在。

$: ls foo                     # no such file exists
ls: cannot access 'foo': No such file or directory
$: echo hello > foo           # create it and add content
$: ls -l foo                  
-rw-r--r-- 1 P2759474 1049089 6 Jun  3 08:14 foo
$: cat foo
hello

$: echo world > foo           # TRUNCATES and adds new content
$: ls -l foo
-rw-r--r-- 1 P2759474 1049089 6 Jun  3 08:14 foo
$: cat foo
world

$: rm foo                     
$: ls foo
ls: cannot access 'foo': No such file or directory
$: set -o noclobber           # set > as nondestructive
$:  echo hello > foo          # still creates new file
$: ls -l foo
-rw-r--r-- 1 P2759474 1049089 6 Jun  3 08:15 foo
$: cat foo
hello

$: echo world > foo           # now will not destroy existing data
bash: foo: cannot overwrite existing file
$: echo world >> foo          # but >> appends
$: ls -l foo
-rw-r--r-- 1 P2759474 1049089 12 Jun  3 08:15 foo
$: cat foo
hello
world

$: echo gone >| foo           # *explicitly* truncate and add new data
$: ls -l foo
-rw-r--r-- 1 P2759474 1049089 5 Jun  3 08:16 foo
$: cat foo
gone
Run Code Online (Sandbox Code Playgroud)


Cha*_*ffy 5

“无法覆盖现有文件”意味着该文件set -o noclobber已在您的 shell 中运行。

要禁用它,请运行set +o noclobber.