Ich habe eine Software, die /bin/sh
Bash sein muss, aber für Ubuntu ist der Standard Dash und ich möchte den Standard beibehalten. Ich möchte es nicht dauerhaft in Bash ändern.
Gibt es eine Möglichkeit, dies nur für eine laufende Terminalsitzung zu ändern? Ein Programm, das in diesem Terminal ausgeführt wird, wird also /bin/sh
mit Bash verknüpft, aber der Rest des Systems wird weiterhin Dash sehen. Oder kann ich die Software austricksen, um sie /bin/sh
als Bash zu sehen, auch wenn dies nicht der Fall ist?
Ich habe nicht diese Software schreiben und Hacking , es zu benutzen , /bin/bash
anstatt /bin/sh
ist nicht wirklich eine Option.
command-line
bash
sh
Corwin
quelle
quelle
/bin/sh
es sichbash
um einen Fehler handelt, tatsächliche Probleme verursacht (wie Sie herausfinden). Wenn sich niemand beschwert, wird es möglicherweise nie geändert.Antworten:
Zwei Antworten schlagen bereits vor, Mounts zu chrooten und zu binden, und es gibt eine dritte, eng verwandte Option: Mount-Namespaces . Mit dem
unshare
Programm können Sie einen neuen Mount-Namespace erstellen, und Mounts in diesem Namespace wirken sich nicht auf andere Namespaces aus.Zum Beispiel mache ich in einem Terminal:
Und in einem anderen:
Sie können dieses unflexible Programm also in einem eigenen Mount-Namespace ausführen.
quelle
Wenn es sich um ein Skript handelt, rufen Sie das Skript einfach als auf
Links müssen nicht geändert werden.
Für kompilierte ausführbare Dateien können Sie chroot Route gehen:
Und dann führen Sie Ihr Programm oder
sudo chroot rootfs /yourprogram
In der Praxis gibt es jedoch keinen Grund, warum Sie nicht
/bin/bash
als Symlink zu verwenden können/bin/sh
. Tatsächlich verwendete Ubuntu vor Version 6.10/bin/bash
as/bin/sh
und wechselte dann aufgrund/bin/sh
einer viel schnelleren und schlankeren Implementierung von POSIX/bin/sh
(dh es entspricht dem POSIX-Standard für das Verhalten von Unix-ähnlichen Betriebssystem-Dienstprogrammen und Betriebssystemen und einige ihrer Interna implementieren) und aus Gründen der Portabilität. Ich empfehle dringend, auch Gilles 'Antwort zu lesen, um historische Notizen darüber zu erhalten, wie es dazu/bin/dash
kam. Aus Gründen der Kompatibilität werden Skripte, die für diedash
Verwendung von POSIX-Funktionen geschrieben wurdenbash
, als Standard-Shell ausgeführt. Normalerweise ist es umgekehrt, was Probleme verursacht -bash
verfügt über Funktionen, die von nicht benötigt werden/bin/sh
, wie die<<<
Syntax oder Arrays.Darüber hinaus wurde der betreffende Befehl wahrscheinlich unter Berücksichtigung von RHEL oder CentOS geschrieben, das
/bin/bash
als Symlink zu verwendet/bin/sh
wird. Es schlägt zwei Dinge vor: Sie zielen wahrscheinlich auf ein bestimmtes Betriebssystem ab und haben die POSIX-Prinzipien nicht eingehalten. In diesem Fall ist es auch eine gute Idee, zu überprüfen, welche anderen Dinge der Befehl erfordert, da Sie möglicherweise mehr Probleme haben, als nur eine erneute Verknüpfung vorzunehmen, wenn er wirklich für ein anderes Betriebssystem geschrieben wurde/bin/sh
.quelle
ln
odercp -l
) zu erstellen .mount --rbind --make-rslave
eher alscp -r
. Kann auch schreibgeschützt gemacht werden. Führtsudo chroot
das Skript auch als root aus, was möglicherweise nicht optimal ist.Eine Möglichkeit wäre ein Bind-Mount einer einzelnen Datei. Um dies zu tun, hängen Sie die Datei
/bin/bash
direkt über/bin/dash
so einebash
Art Cover oder Hidesdash
. Hier sind die Schritte (einschließlich der Umkehrung):Ich habe jedoch nicht versucht, den Symlink
mount --bind /bin/bash /bin/sh
direkt auszublenden . Der obigemount
Trick macht nur Bash und Dash identisch, so dass ersh
sich darauf bezieht,bash
obwohl er darauf verweistdash
. Dies ist auch eine systemweite Lösung, nicht nur für das aktuelle Terminalfenster.Ich muss gestehen, das könnte übertrieben sein und es ist viel einfacher, den Symlink nur vorübergehend zu ändern. Ich wollte nur einen anderen möglichen Weg zeigen.
quelle
Sie sollten es nur für die aktuelle Sitzung mithilfe eines Alias ändern können. Bevor Sie Ihren Befehl im Terminal ausführen:
Dies ist vorübergehend und nur in dem Terminal aktiv, von dem aus es ausgeführt wurde.
JEDOCH: Dies funktioniert NICHT, wenn Ihr Skript absolute Pfade verwendet.
Leider ist das "Hacken" des Skripts möglicherweise Ihre einzige Option. Per Convo mit @vanadium können Sie ein Wrapper-Skript wie folgt erstellen:
Während der Dauer Ihres Skripts hoffen Sie jedoch besser, dass nichts auf Ihrem System explizit einen Strich erfordert.
quelle