Вы можете направить вывод во временный файл, а затем переместить временный файл поверх исходного. Кроме того, вы могли иметь в виду работать с одной строкой за раз, и в этом случае вам следует отказаться отg
:
for i in {1..5}; do
sed -e "s/abc/$(seq 1 $i)/" test > test.tmp
mv test.tmp test
done
В исходных системах Unix sh
была специальной программой с особым поведением. Его часто противопоставляли другим оболочкам, появившимся позже, таким как csh
и ksh
.
Однако POSIX стандартизировал поведение sh
, а в современных операционных системах с открытым исходным кодом обычно sh
на самом деле является какой-то другой реализацией, и у него просто есть режим, который обеспечивает поведение POSIX. Например, во FreeBSD мы будем называть ash
как sh
; в OpenBSD sh
и ksh
— одна и та же программа, а в Linux вы часто найдете bash
или dash
как sh
(, хотя Debian разрешает многие другие, включая zsh
, mksh
, posh
и потенциально другие ).
В таком случае верно то, что любая оболочка, вызываемая как sh
, выполняет ту же работу, что и sh
, потому что в этих системах нет независимой sh
программы. Это просто режим, обеспечивающий поведение POSIX.
В этом режиме POSIX считываются файлы запуска /etc/profile
и $HOME/.profile
для оболочек входа в систему и содержимое файла, на который указывает $ENV
для интерактивных оболочек, если эта переменная среды отсутствует. Специальные файлы оболочки -не вызываются.
When invoked with sh Bash enters POSIX mode after reading startup files. But what are these startup files?
Файлы запуска также зависят от того, был ли он запущен как sh
или нет.
В обычном режиме как интерактивная оболочка:/etc/profile
и первая из ~/.bash_profile
/ ~/.bash_login
/ ~/.profile
, если это оболочка входа, и просто ~/.bashrc
, если не оболочка входа.
В режиме sh
:/etc/profile
и ~/.profile
если оболочка входа в систему; и все, на что указывает переменная окружения $ENV
, если она интерактивна. В частности, он не читает файлы ~/.bash*
в режиме sh
.
Подробности смотрите в руководстве, это не совсем просто:6.2 Файлы запуска Bash
So the point is if bash is doing the work of sh in my system than does this means that there is no sh in my system and all the scripts with sh is invoked by bash or any other shell to which sh points to.
Я не совсем уверен, в чем вопрос, и какой еще должна быть оболочка, когда Bash выполняет работу sh. Но в любом случае, если /bin/sh
указывает на/bin/bash
(или является другой копией Bash ), то все скрипты, использующие хэш-банг #!/bin/sh
, и команды, начинающиеся, например, с. вызов библиотеки system()
в C будет выполняться с использованием Bash. Но это нормально, так как Bash вполне совместим с этими вариантами использования.
Также обратите внимание, что csh
принадлежит к другому семейству и не совместим с POSIX sh.