«Невозможно перезаписать существующий файл» из '' echo content> file.sh ''

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

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

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

-bash: hello.sh: cannot overwrite existing file

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

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

Источник
  • 0
    замените hello.sh на что-нибудь другое
  • 1
    echo foo >hello.sh выполняет все эти шаги - создает файл, записывает в него строку и закрывает его.
  • 1
    Тем не менее, «невозможно перезаписать существующий файл», если вы не настроили свою оболочку с некоторыми нестандартными флагами, подразумевает, что этот файл уже выполняется, и что вы работаете в операционной системе, которая не разрешает файлы, которые выполняются. быть измененным одновременно.
  • 1
    Как правило , лучше всего создать новый файл и записать в него, а затем переименовать его поверх старого, когда вы закончите, когда вы захотите изменить потенциально работающий исполняемый файл.
  • 1
    Кстати, если вы хотите записать несколько строк в файл между его созданием и закрытием, создайте блок кода. { echo "first line"; echo "second line"; echo "third line"; } >hello.sh открывается только один раз перед всеми тремя эхами и закрывается, когда все они будут выполнены.
  • 0
    Или вставьте символы новой строки в строку с правильными кавычками. например, printf '%s\n%s\n' hello$'\n'"world!" "It's me!" > foo
  • 0
    Обязательно проверьте права доступа к этому файлу. Некоторые системы Linux автоматически создают файлы, доступные только для чтения, поэтому вам, возможно, придется использовать команду chmod для изменения его разрешений. Я бы воспользовался некоторыми отличными статьями по темам прав доступа к файлам и chmod.
Codelisting
за 2 против

Я часто использую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
    cf mywiki.wooledge.org/NoClobber и прочую полезность BashFAQ.
  • 0
    Я использую noclobber в своих интерактивных оболочках, но не в скриптах.
  • 0
    Я определенно использую его в сценариях, где поведение имеет значение, и использую >| если я хочу перезаписать любой файл, который может существовать.
за 0 против

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

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

Codelisting
Популярные категории
На заметку программисту