Почему sh имеет символическую ссылку на dash или bash?

Вы можете направить вывод во временный файл, а затем переместить временный файл поверх исходного. Кроме того, вы могли иметь в виду работать с одной строкой за раз, и в этом случае вам следует отказаться отg:

for i in {1..5}; do
    sed -e "s/abc/$(seq 1 $i)/" test > test.tmp
    mv test.tmp test
done
0
23.05.2021, 15:47
2 ответа

В исходных системах 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для интерактивных оболочек, если эта переменная среды отсутствует. Специальные файлы оболочки -не вызываются.

2
28.07.2021, 11:30

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.

3
28.07.2021, 11:30

Теги

Похожие вопросы