Etwas ist in einem "Admin"-Skript verwirrend

Etwas ist in einem "Admin"-Skript verwirrend

Ich habe ein Open-Source-Paket heruntergeladen und make. Aber wenn ich das adminSkript ausführe und versuche, es zu starten, tritt ein Fehler auf. Ich habe festgestellt, dass es ein Problem mit dem gab path. Aber es gibt immer noch ein Problem, das mich verwirrt:

#! /bin/bash

# ionadmin - temporary wrapper script for .libs/ionadmin
# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1
#
# The ionadmin program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.

# Sed substitution that helps us do robust quoting.  It backslashifies
# metacharacters that are still active within double-quoted strings.
sed_quote_subst='s/\([`"$\\]\)/\\\1/g'

# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
  emulate sh
  NULLCMD=:
  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
  1. sed_quote_subst: welchen Wert hat es? Aufgrund der Existenz von sind ''einige Metadaten in ''deaktiviert. Aber ich weiß nicht, welche das sind.
  2. #!/bin/bash& zsh emulate: Die erste Zeile gibt an, dass dieses Skript in Bash ausgeführt wird. Warum gibt es also ein Emulate, das von zsh stammt?
  3. alias -g '${1+"$@"}'='"$@"': Ich habe dies gerade in eine andere Bash eingegeben und erhalte den Fehler: -g :invalid option, Ich bin verwirrt über den Unterschied zwischen zsh und bash und wie sie zusammenarbeiten. Könnten Sie es mir bitte erklären?

Ich bin ein Neuling auf diesem Gebiet, daher ist diese Frage für Sie vielleicht nicht so „nützlich“. Aber Ihre Antwort kann mir helfen, diese Welt besser zu verstehen.

Antwort1

  1. #!/bin/bash& zsh emulate: Die erste Zeile gibt an, dass dieses Skript in Bash ausgeführt wird. Warum gibt es also ein Emulate, das von zsh stammt?

Die erste Zeile, der Shebang, gibt lediglich an, dass das Skript bei direkter Ausführung mit Bash ausgeführt wird. Sie können es aber auch mit Zsh ausführen:

zsh admin.sh

Ich weiß nicht, warum der Autor auf die Idee kam, für zsh zu testen, aber er hat es getan. Dieser Codeabschnitt ist für zsh und läuft nicht in bash:

emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
# is contrary to our usage.  Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
  1. alias -g '${1+"$@"}'='"$@"': Ich habe dies gerade in eine andere Bash eingegeben und erhalte den Fehler: -g :invalid option, Ich bin verwirrt über den Unterschied zwischen zsh und bash und wie sie zusammenarbeiten. Könnten Sie es mir bitte erklären?

Das ist eine sehr weit gefasste Frage. Ich werde nicht alle Unterschiede zwischen zsh und bash erklären - lesen Sie dazu die Dokumentation beider. Was den speziellen Punkt von betrifft alias -g, hat zshallgemeinAliase. In Bash werden Aliase nur am Zeilenanfang ersetzt. In Zsh alias -gwerden globale Aliase definiert, die überall in der Zeile ersetzt werden.

Wenn ich das also in zsh mache:

alias -g foo=bar

Und dann führen Sie aus:

echo foo

Die Ausgabe lautet:

bar

Antwort2

Zu Ihren Fragen fehlen Informationen, aber ich werde versuchen, sie wie folgt zu beantworten:

  1. sed regexp entmystifizieren

    s/\([`"$\\]\)/\\\1/g'
    ^     ^         ^----------------- with The character with a leading \
          | 
    |     | --- the characters `"$\
    |
    |-- replace
    

    So "wird\"

  2. Ich habe keine Ahnung, zsh ist nicht mein Ding, wenn Sie Skripte ausführen.

  3. Testen Sie if-Anweisungen wie diese:

    if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then 
         echo "Does the if statement run in my shell?"; 
    else 
         echo "The else statement runs in my shell"; 
    fi 
    

verwandte Informationen