30Jul

Wann ist es besser, # zu verwenden! /bin/ Bash Statt #!/bin/ sh in einem Shellskript?

Wenn Sie ein neues Shell-Skript erstellen, möchten Sie sicherstellen, dass es so problemlos wie möglich ist, aber manchmal kann es etwas verwirrend sein zu wissen, welcher Shebang der beste für Sie ist. In diesem Sinne hat der heutige SuperUser Q & A Post die Antwort auf die Frage eines verwirrten Lesers.

Heutige Frage &Die Antwortsitzung kommt dank SuperUser, einer Unterteilung von Stack Exchange, einer Community-gesteuerten Gruppierung von Q & A-Websites, zu uns.

Die Frage

SuperUser Reader Hendre möchte wissen, wann # besser ist! /bin/ Bash statt #!/bin/ sh in Shell-Skripten:

Wann ist es sinnvoller, # zu verwenden! /bin/ Bash statt #!/bin/ sh in einem Shell-Skript?

Wann ist es besser, # zu verwenden! /bin/ Bash statt #!/bin/ sh in einem Shell-Skript?

Die Antwort

SuperUser contributor grawity hat die Antwort für uns:

Kurz gesagt:

  • Es gibt mehrere Shells, die eine Obermenge der POSIX sh-Spezifikation implementieren. Auf verschiedenen Systemen kann /bin/ sh eine Verbindung zu Ash, Bash, Dash, Ksh, Zsh usw. sein. Es wird immer sh-kompatibel sein, aber niemals csh oder fish.
  • Solange Sie sich nur an SH-Funktionen halten, können Sie # verwenden( und wahrscheinlich sogar verwenden)!/bin/ sh und das Skript sollte gut funktionieren, egal welche Shell es ist.
  • Wenn Sie bash-spezifische Funktionen( d. H. Arrays) verwenden, sollten Sie bash explizit anfordern, denn selbst wenn /bin/ sh bereits bash auf Ihrem System aufruft, ist es möglicherweise nicht auf dem System eines anderen, und Ihr Skript läuft nicht dort. Das Gleiche gilt natürlich auch für zsh und ksh.
  • Selbst wenn das Skript nur für den persönlichen Gebrauch gedacht ist, stellen Sie möglicherweise fest, dass einige Betriebssysteme während Upgrades /bin/ sh ändern. Zum Beispiel war es bei Debian Bash, wurde aber später durch den sehr minimalen Bindestrich ersetzt. Skripte, die Bashismen benutzten, hatten aber #!/bin/ sh ist plötzlich kaputt gegangen.

Jedoch:

  • Sogar #!/bin/ Bash ist nicht so korrekt. Auf verschiedenen Systemen kann Bash in /usr/-Klasse , /usr/pkg/-Klasse oder /usr/local/-Klasse leben.
  • Eine zuverlässigere Option ist #!/usr/bin/ env bash , die $ PATH verwendet. Obwohl das env-Tool selbst nicht unbedingt garantiert ist, funktioniert /usr/bin/ env immer noch auf mehr Systemen als /bin/ bash .

Haben Sie etwas zur Erklärung hinzuzufügen? Ton in den Kommentaren ab. Möchten Sie mehr Antworten von anderen technisch versierten Stack Exchange Benutzern lesen? Sehen Sie sich den vollständigen Diskussionsfaden hier an.

Bildquelle: Wikipedia