#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
.