У меня есть часть программного обеспечения, для которой требуется /bin/sh
Bash, но для Ubuntu по умолчанию используется Dash, и я хочу оставить его по умолчанию; Я не хочу постоянно менять его на Bash.
Есть ли способ изменить его только для запущенной терминальной сессии? Таким образом, программа, запущенная в этом терминале, увидит, что она /bin/sh
связана с bash, а остальная часть системы все еще увидит Dash? Или я могу обмануть программное обеспечение, чтобы оно выглядело /bin/sh
как Bash, даже если его нет?
Я не писал это программное обеспечение, и взломать его для использования, /bin/bash
а /bin/sh
не на самом деле вариант.
command-line
bash
sh
Корвин
источник
источник
/bin/sh
,bash
что это ошибка, и это вызывает реальные проблемы (как вы выяснили). Если никто не жалуется, он может никогда не измениться.Ответы:
В двух ответах уже предлагается chrooting и bind mounts, и есть третий, тесно связанный вариант: mount namespaces . Используя
unshare
программу , вы можете создать новое пространство имен монтирования, и монтирование в этом пространстве имен не повлияет на другие пространства имен.Например, в одном терминале я делаю:
И в другом:
Таким образом, вы можете запустить эту негибкую программу в собственном пространстве имен монтирования.
источник
Если это скрипт, просто вызовите скрипт как
Нет необходимости менять ссылки вообще.
Для скомпилированного исполняемого файла вы можете пойти по пути chroot:
А затем запустите вашу программу или
sudo chroot rootfs /yourprogram
Однако на практике нет причин, по которым вы не можете использовать
/bin/bash
в качестве символической ссылки/bin/sh
. Фактически, до версии 6.10 Ubuntu использовала/bin/bash
as/bin/sh
, а затем они переключились из-за/bin/sh
того, что были более быстрой и более тонкой реализацией POSIX/bin/sh
(то есть она придерживается стандарта POSIX для того, как Unix-подобные утилиты операционной системы и ОС должны вести себя и реализовать некоторые из их внутренних), и из-за соображений переносимости. Я настоятельно рекомендую прочитать ответ Жиля, а также исторические заметки о том, как это/bin/dash
произошло. Что касается совместимости, сценарии, написанные дляdash
использования функций POSIX, будут работать сbash
идеальной оболочкой по умолчанию. Обычно, наоборот, вызывает проблемы -bash
имеет функции, которые не требуются/bin/sh
, такие как<<<
синтаксис или массивы.Кроме того, рассматриваемая команда, вероятно, написана с учетом RHEL или CentOS, которая использует
/bin/bash
символическую ссылку на/bin/sh
, и предлагает две вещи: они, вероятно, нацелены на конкретную ОС и не придерживаются принципов POSIX. В этом случае было бы также неплохо проверить, что еще требуется команде, поскольку, если она действительно написана для другой ОС, вы можете столкнуться с большим количеством проблем, чем просто повторное связывание/bin/sh
.источник
ln
илиcp -l
).mount --rbind --make-rslave
а неcp -r
. Может быть сделано только для чтения. Такжеsudo chroot
запускает скрипт как root, что может быть неоптимально.Одной из возможностей может быть привязка монтирования одного файла. Чтобы сделать это, вы монтируете файл
/bin/bash
только над/bin/dash
такимbash
видом обложек или шкурdash
. Вот шаги (включая обратную):Я не пытался
mount --bind /bin/bash /bin/sh
напрямую скрыть символическую ссылку, хотя. Приведенный вышеmount
трюк просто делает bash и dash идентичными, так что этоsh
относится,bash
хотя и указывает наdash
. Кроме того, это общесистемное решение, а не только для текущего окна терминала.Я должен признаться, это может быть излишним, и просто временно изменить символическую ссылку гораздо проще. Я просто хотел показать другой возможный путь.
источник
Вы должны иметь возможность изменить его только для текущего сеанса, используя псевдоним. Перед запуском вашей команды в терминале:
Это будет временным и активным только в терминале, с которого он был выполнен.
ОДНАКО: Это НЕ РАБОТАЕТ, если ваш скрипт использует абсолютные пути.
К сожалению, «взлом» сценария может быть единственным вариантом. С помощью @vanadium вы можете создать скрипт-обёртку следующим образом:
Тем не менее, во время выполнения сценария вам лучше надеяться, что ничто в вашей системе явно не требует тире.
источник