«невозможно перезаписать существующий файл» из «эхо-содержимого >file.sh»

#linux #shell

Вопрос:

Я совершенно новичок в Linux и все еще пытаюсь понять основные команды. Мой инструктор просто дал нам несколько упражнений, которые мы должны были выполнить самостоятельно, одно из которых состояло в том, чтобы просто создать файл под названием hello.sh и добавьте к нему несколько строк текста. Для этого я написал следующий код в свой MobaXterm:

 touch hello.sh
echo "Hello $LOGNAME!" > hello.sh
 

а затем было несколько других эхо-команд, которые я тоже хотел добавить, но сразу же после ввода этой первой команды «эхо» мой терминал говорит

-баш: hello.sh: не удается перезаписать существующий файл

Что здесь происходит? Я сделал нечто подобное с файлом .txt, и, похоже, это сработало. Проблема связана с типом файла или я просто путаю команды? (Кроме того, извините, если я использовал неправильные теги — не совсем уверен, что лучше всего подходит для этого вопроса.)

Спасибо за любую помощь!

Комментарии:

1. изменение hello.sh к чему-то другому

2. echo foo >hello.sh выполняет все эти действия-создает файл, записывает в него строку и закрывает его.

3. Тем не менее, «невозможно перезаписать существующий файл», если вы не настроили свою оболочку с некоторыми флагами, отличными от флагов по умолчанию , означает, что этот файл уже выполняется и что вы находитесь в операционной системе, которая не позволяет одновременно изменять выполняемые файлы.

4. В общем , лучше всего создать новый файл и записать в него, а затем переименовать его поверх старого, когда вы закончите, когда захотите изменить потенциально работающий исполняемый файл.

5. Кстати, если вы хотите записать несколько строк в файл между его созданием и закрытием, создайте блок кода. { echo "first line"; echo "second line"; echo "third line"; } >hello.sh открывается только один раз перед всеми тремя эхо-сигналами и закрывается, когда все они закончены.

Ответ №1:

Я часто использую эту 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
 

Комментарии:

1. c.f. mywiki. wooledge.org/NoClobber и все остальное добро БашфАКА.

2. Я использую noclobber в своих интерактивных оболочках, но не в сценариях.

3. Я определенно использую его в сценариях, где поведение имеет значение, и использую >| , если я собираюсь перезаписать любой файл, который может существовать.

Ответ №2:

«Невозможно перезаписать существующий файл» означает, что set -o noclobber он был запущен в вашей оболочке.

Чтобы отключить его, запустите set o noclobber .