Это довольно сложно рассмотреть. Для начала:
sh
, которая реализует определенный язык оболочки. В любой данной реальной системе sh
фактически будет одной из реальных оболочек, таких как оболочка Z, оболочка Almquist, оболочка Korn, оболочка Bourne Again и так далее; обычно распознает, что он был вызван по имени sh
и работает в режиме POSIX . #!/bin/sh
в качестве своего интерпретатора, должны были не полагаться на так -, называемые башизмами , и, наоборот, сценарии, которые действительно полагались на башизмы, должны были явно указывать оболочку Bourne Again в качестве своего интерпретатора, а не sh
. Удалять скорлупу довольно просто. Один удаляет такие пакеты, как ash
, bash
, posh
, mksh
, pdksh
, tcsh
, dash
и т. д.; с помощью инструмента управления пакетами, такого как aptitude
. Сложность заключается в том, что два из них помечены как «необходимые» — dash
и bash
— а это означает, что другие пакеты могут предполагать их присутствие без явного объявления зависимости от них, и удалить -нетривиально. их, так как менеджер пакетов намеренно потребует от вас дополнительных действий, чтобы подтвердить, что вы действительно хотите их удалить.
Беда приходит с последствиями этого.
#!/bin/bash
интерпретаторами скриптов. Такие скрипты не будут работать, если удалить оболочку Bourne Again, даже если останется оболочка Debian Almquist. system()
или явно execvpe()
утилиты sh
. В результате:
rc
, которые не смогут sh
интерпретировать их. Запустите systemctl list-unitsВсе службы, которые вы видите с «LSB :» или «SYSV :» в начале их описания, нуждаются в интерпретаторе оболочки для работы. Точно так же такие программы, как
rabbitmq-server
или mysqld_safe
, которые иногда (ab )используются в качестве служб, на самом деле являются сценариями оболочки. /lib/systemd/systemd-sysv-install
— это только один пример. Другие включают /usr/sbin/service
, /usr/sbin/invoke-rc.d
и даже /bin/fgrep
. rescue.service
, иemergency.service
(в версии systemd в Ubuntu 16 )используют /bin/sh
. /bin/sh
.Вики Убунту. /bin/sh
. Дебиан вики. Гипотеза:/var/www/html/modul-cscart.com/public_html/app/addons/sendsms
является символической ссылкой с несуществующей целью.
cd
говорит No such file or directory
, потому что цель не существует. Тем не менее, символическая ссылка существует, поэтому ln
говорит File exists
. Я предполагаю, что ваш FTP-сервер настроен на игнорирование недействительных или всех символических ссылок.
Выполните следующую команду, чтобы подтвердить гипотезу:
ls -ld /var/www/html/modul-cscart.com/public_html/app/addons/sendsms
Если символическая ссылка существует, просто удалите ее перед тем, как ln -s …
создать ее заново (с правильной целью, на этот раз ); или используйте ln -s -f …
, чтобы перезаписать ln
без жалоб.
Предупреждение :Удаление или перезапись чего-либо, кроме символической ссылки, может привести к потере данных. Удаление или перезапись символической ссылки отбрасывает информацию о ее цели. Убедитесь, что вы знаете, что это за файл на самом деле. Помимо приведенной выше команды ls -ld …
, используйте file
(, если доступно ):
file /var/www/html/modul-cscart.com/public_html/app/addons/sendsms
Этот инструмент должен явно сообщить вам, что ссылка не работает, если это так.
Моя попытка воспроизвести проблему:
$ mkdir /tmp/test608752
$ cd /tmp/test608752
$ ls
$ ln -s foo bar
$ ln -s /tmp bar
ln: failed to create symbolic link 'bar': File exists
$ cd bar
-bash: cd: bar: No such file or directory
$ ls -ld bar
lrwxrwxrwx 1 kamil kamil 3 Sep 10 12:04 bar -> foo
$