Intereting Posts
Я хочу увидеть список всех интерфейсов dbus с командой в терминале .h Инструмент сетевого мониторинга для Linux Разрешения файловой системы Debian Не открывайте новый экземпляр приложения, если он уже открыт в другой рабочей области в Mint Возможна ли передача файлов на хост-хост через USB Type-C? Как я могу повернуть мой дисплей с помощью какого-либо инструмента GUI в LXDE? Почему useradd показывает ошибку отказа от разрешения NixOS на MacBook: как включить датчик внезапного движения? как остановить воспроизведение Clementine при приостановке использования systemd Как установить групповую политику для доступа ко всем папкам, кроме одного? Как вставить новую строку после первой строки в файле, который похож на нее Сравните два файла в Shell Script разделителем и обновите один файл MATE Desktop «WindowList» -applet имеет две строки – как я могу вернуться к одиночному? Как искать определенные разделы файла, а затем извлекать только соответствующую информацию в этом разделе? Использование как Grep, так и Cut

Есть ли еще один простой способ добавить строку к концу файла, отличную от `>>`?

Недавно я tree_hole короткие предложения к файлу tree_hole .

Я использовал echo 'something' >> tree_hole чтобы выполнить эту работу.

Но я всегда беспокоился о том, что, если я ошибаюсь в вводе > вместо >> , так как я делал это часто.

Таким образом, я создал глобальную функцию bash в моем bashrc:

 function th { echo "$1" >> /Users/zen1/zen/pythonstudy/tree_hole; } export -f th 

Но мне интересно, есть ли еще один простой способ добавить строки в конец файла. Потому что мне может понадобиться использовать это часто в других случаях.

Есть ли?

Установите параметр noclobber оболочки:

 bash-3.2$ set -o noclobber bash-3.2$ echo hello >foo bash-3.2$ echo hello >foo bash: foo: cannot overwrite existing file bash-3.2$ 

Если вы беспокоитесь, что ваш файл будет поврежден оператором > вы можете изменить свой файловый атрибут только для добавления:
В файловой системе ext2 / ext3 / ext4 : chattr +a file.txt
В файловой системе XFS : echo chattr +a | xfs_io file.txt echo chattr +a | xfs_io file.txt

И если вы хотите использовать функцию, я уже сам выполнил функцию (я использовал ее в служебном файле для протоколирования выходов), вы можете изменить ее для своей цели:

 # This function redirect logs to file or terminal or both! #@ USAGE: log option data # To the file -f file # To the terminal -t function log(){ read -r data # Read data from pipe line [[ -z ${indata} ]] && return 1 # Return 1 if data is null # Log to /var/log/messages logger -i -t SOFTWARE ${data} # While loop for traveling on the arguments while [[ ! -z "$*" ]]; do case "$1" in -t) # Writting data to the terminal printf "%s\n" "${data}" ;; -f) # Writting (appending) data to given log file address fileadd=$2 printf "%s %s\n" "[$(date +"%D %T")] ${data}" >> ${fileadd} ;; *) ;; esac shift # Shifting arguments done } 

Используйте tee с опцией добавления:

 foo | tee -a some-file # or tee -a some-file <<EOF blah blah EOF # or tee -a some-file <<<"blah blah" 

многие программы, которые могут открывать файлы для перезаписи, могут альтернативно открывать их для добавления, например gnu dd.

 dd conv=notrunc oflag=append of=file 

он может читать stdin или файл с именем в параметре if= add 2>/dev/null чтобы подавить количество байтов.

Я бы хотел использовать sed (даже с резервной копией – см. Расширение после -i ):

 sed -i.bak '$ a\something' /Users/zen1/zen/pythonstudy/tree_hole 

Вы всегда можете искать файл другим способом …

 seq 10000000 >f { wc -l >&2; echo new line\!; } <>f >&0; \ { wc -l >&2; echo new line\!; } <>f >&0; \ { wc -l >&2; echo new line\!; } <>f >&0; \ { wc -l >&2; echo new line\!; } <>f >&0; \ { wc -l >&2; echo new line\!; } <>f >&0; \ wc -lf; tail f 

… эта странная выглядящая последовательность печатает:

 10000000 10000001 10000002 10000003 10000004 10000005 f 9999996 9999997 9999998 9999999 10000000 new line! new line! new line! new line! new line! 

Но это глупо.

Более полезный пример может выглядеть так:

  apnd() if shift then wc -l >&2 printf "$@" fi <>"$1" >&0 

Вы можете назвать это так:

  apnd /path/to/file \ "${printf_fmt_string}" \ arbitrary list of strings 

И вы закончите с количеством строк file , написанных в stderr перед тем, как произойдет действие append.