ubuntuusers.de

Wo liegt bash? /usr/bin oder /bin ?

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 20.04 (Focal Fossa)
Antworten |

fleet_street

Top-Wikiautor
Avatar von fleet_street

Anmeldungsdatum:
30. August 2016

Beiträge: 2400

Wohnort: Hunsrück (dunkle Seite)

Ich bin durch ein anderes Thema darauf aufmerksam geworden.

user_unknown schrieb:

… nur liegt das Programm bei mir nicht in /usr/bin sondern in /bin.

Ups, ich hatte das nicht näher untersucht, aber ich dachte das wäre im Wandel:

1
2
3
fleet@MATE-focal ~ $ which bash
/usr/bin/bash
fleet@MATE-focal ~ $

Das gleiche unter Ubuntu (GNOME).

Allerdings:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fleet@MATE-focal ~ $ dpkg -S /usr/bin/bash
dpkg-query: Kein Pfad gefunden, der auf Muster /usr/bin/bash passt
fleet@MATE-focal ~ $ dpkg -S /bin/bash
bash: /bin/bash
fleet@MATE-focal ~ $ env | grep bash
SHELL=/bin/bash
fleet@MATE-focal ~ $ ls -l /usr/bin/bash
-rwxr-xr-x 1 root root 1183448 Jun 18 17:44 /usr/bin/bash
fleet@MATE-focal ~ $ ls -l /bin/bash
-rwxr-xr-x 1 root root 1183448 Jun 18 17:44 /bin/bash
fleet@MATE-focal ~ $

Bin ein wenig irritiert und mir stellen sich ein paar Fragen:

  • Wo liegt denn nun bash?

  • Wie kommt es nach /usr/bin, wenn nicht durch das Paket? (Auch nicht durch /var/lib/dpkg/info/bash.postinst)

  • Was sollte ich in meinen Skripten als Shebang verwenden?

encbladexp Team-Icon

Ehemaliger
Avatar von encbladexp

Anmeldungsdatum:
16. Februar 2007

Beiträge: 17528

Es ist gängig /bin/bash zu verwenden, siehe hierzu: FHS

Warum ist das nun bei dir so, nun:

[stefan:~] 3m21s $ ls -l -h -d /bin
lrwxrwxrwx 1 root root 7  3. Sep 00:30 /bin -> usr/bin
[stefan:~] $ ls -l -h -d /usr/bin
drwxr-xr-x 1 root root 92K 20. Nov 09:58 /usr/bin

Viele Distributionen haben /usr/bin und /bin gemerged, und es gibt jetzt einen Symlink. Eventuell ist dies auch bei Ubuntu mittlerweile der Fall, dpkg kann dies nicht erkennen.

mfg Stefan

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

fleet_street schrieb:

Bin ein wenig irritiert und mir stellen sich ein paar Fragen:

  • Wo liegt denn nun bash?

In /usr/bin/, weil

$ ls -ld /bin
lrwxrwxrwx 1 root root 7 Okt 20  2019 /bin -> usr/bin 
  • Wie kommt es nach /usr/bin, wenn nicht durch das Paket? (Auch nicht durch /var/lib/dpkg/info/bash.postinst)

Das Paket schreibt es nach /bin (https://packages.ubuntu.com/focal/amd64/bash/filelist), aber seit Disco Dingo ist /bin/ bei Neuinstallationen ein Symlink auf /usr/bin/ (vgl. https://lists.ubuntu.com/archives/ubuntu-devel-announce/2018-November/001253.html), das liegt an https://wiki.debian.org/UsrMerge

  • Was sollte ich in meinen Skripten als Shebang verwenden?

/usr/bin/bash wird nicht auf älteren Ubuntu-Versionen funktionieren und /bin/bash sollte uns in Debian und Ubuntu noch eine Weile erhalten bleiben.

fleet_street

Top-Wikiautor
(Themenstarter)
Avatar von fleet_street

Anmeldungsdatum:
30. August 2016

Beiträge: 2400

Wohnort: Hunsrück (dunkle Seite)

Ach, ja richtig: /bin ist ein Link auf /usr/bin. Das war mit vor einem halben Jahr schon aufgefallen. Nur heute morgen ist es mir erst wieder eingefallen, nachdem ich es hier in euren Antworten gelesen habe.

Ich denke, ich werde es so halten: Für Skripte, die auf alten oder upgegradeten Systemen laufen sollen und die ich evtl. mal veröffentlichen möchte, verwende ich das bewährte /bin/bash. Für meine definitv internen kann ich mich schon mal an /usr/bin/bash gewöhnen (Wenn ich dran denke 😉 ).

Vielen Danke für eure Antworten.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Mal als Ergänzung: Wenn es möglich ist, die Scripte nach posix-Standard zu lassen, ist #!/bin/sh vorzuziehen. Das kann auch ein Symlink auf die bash sein, muss aber nicht. Auf anderen Systemen, wie BSD-basierten liegt die bash in /usr/local/bin/, wenn sie denn überhaupt installiert ist. Wenn du also weitreichend Kompatibilität mit alten/anderen Systemen suchst, wäre das vorzuziehen. Wenn du explizite bash-Syntax verwendest, natürlich nicht. Da gäbe es dann andere Vorgehensweisen, wie bspw. mit #!/usr/bin/env bash wenn env überall gleich eingerichtet wäre, etc.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9782

Wohnort: Münster

ChickenLipsRfun2eat schrieb:

[…] Wenn es möglich ist, die Scripte nach posix-Standard zu lassen, ist #!/bin/sh vorzuziehen. […] /usr/local/bin/ […] #!/usr/bin/env bash

Einspruch! "#!/bin/sh" ist nicht der POSIX-kompatible Shebang für die POSIX-kompatible Shell im System. Die anderen Vorschläge ebenso wenig.

Wenn man sich die Mühe macht, die POSIX-Spezifikationen auch einmal selbst zu lesen (z.B. hier: https://pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html ), dann bemerkt man, dass der Shebang selbst nur eine Option ist und keinesfalls für ein POSIX-kompatibles System ein Erfordernis. Idealerweise sollte bei einem POSIX-kompatiblen System ein Skript für die POSIX-kompatible Shell ohne ein solches Helferlein ausgeführt werden.

Weil dies nicht überall funktioniert, darf man aber Shebang benutzen. Dabei ist so vorzugehen:

Der Administrator des Systems muss in den Skripten die erste Zeile so anpassen, dass gemäß der Systemkonfiguration das Programm gestartet wird, welches in dem System für die Aufgabe der POSIX-kompatiblen Shell vorgehen ist. Die Konfiguration erhält man über das Programm getconf, speziell für den Pfad zur POSIX-kompatiblen Shell bei Ubuntu 20.04:

$ getconf PATH
/bin:/usr/bin

Also ist bei Ubuntu 20.04 der bevorzugte Shebang für ein POSIX-kompatibles Shell-Skript eben doch "#! /bin/sh", aber nicht, weil dies der POSIX-Standard so verlangen würde, sondern weil Ubuntu 20.04 so konfiguriert ist. Bei einem anderen Linux kann es anders sein.

Bei Ubuntu wird allerdings die bash gar nicht mit den Aufgaben der POSIX-kompatiblen Shell beauftragt:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jul 18  2019 /bin/sh -> dash

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

seahawk1986 schrieb:

fleet_street schrieb:

In /usr/bin/, weil

$ ls -ld /bin
lrwxrwxrwx 1 root root 7 Okt 20  2019 /bin -> usr/bin 

Auf meinem Xubuntu 20.04 ist das nicht der Fall. Ist allerdings ein Upgrade über mehrere Releases.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ ls -lid /bin /usr/bin /bin/bash /usr/bin/bash /bin/sh /usr/bin/sh
ls: cannot access '/usr/bin/bash': No such file or directory
ls: cannot access '/usr/bin/sh': No such file or directory
    267 drwxr-xr-x 1 root root    2334 Nov 11 23:11 /bin/
6113830 -rwxr-xr-x 1 root root 1183448 Jun 18 17:44 /bin/bash*
6210207 lrwxrwxrwx 1 root root       4 Jul 18  2019 /bin/sh -> dash*
  13734 drwxr-xr-x 1 root root   39800 Nov 18 23:20 /usr/bin/
$ apt-file search -x '^/(usr/)?bin/(ba)?sh$'
bash: /bin/bash                           
dash: /bin/sh

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

rklm schrieb:

Auf meinem Xubuntu 20.04 ist das nicht der Fall. Ist allerdings ein Upgrade über mehrere Releases.

Ja, deswegen hatte ich ja geschrieben, dass das nur bei Neuinstallationen der Fall ist - aus dem verlinkten Announcement-Post für den Beginn der Disco Dingo Entwicklung:

- Merged-usr is now the default in Disco for new installations only. It means that /bin is a symlink to usr/bin, similarly /lib and /sbin. Existing systems, upon upgrade, will not be reconfigured for merged-usr.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

kB schrieb:

Einspruch! "#!/bin/sh" ist nicht der POSIX-kompatible Shebang…

Bedeutet, die maximale Kompatibilität habe ich ohne Shebang, unabhängig davon, dass /bin/sh auf die „Standardshell“ ver-symlinkt wird! Danke! Wieder was gelernt! Ich nutze bspw. unter FreeBSD verschiedene Login-Shells (abhängig vom Nutzer und Spieltrieb). Wenn ich den Link richtig verstanden habe, wird bevorzugt die Login-Shell zum ausführen verwendet, wenn ich keine Shebang eintrage, ansonsten die vom Administrator festgelegte Standardshell unter {/usr}{/local}/bin/sh? Sprich, ich kann mit eigentlich™ die Shebang überall kneifen, außer bei meinen bash-only-Scripten. Habe mir den Link zur neueren Version (https://pubs.opengroup.org/onlinepubs/9699919799/) mal abgespeichert. Da gibt es einiges zu lesen 😉

Antworten |