Algo confuso en un scipts de "admin"

Algo confuso en un scipts de "admin"

Descargué un paquete de código abierto y make. Pero ocurre un error cuando ejecuto el adminscript intentando comenzar. Descubrí que había algún problema con el path. Pero todavía hay algún problema que me confunde:

#! /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: ¿Qué valor tiene? Debido a la existencia de '', algunos metain ''están deshabilitados. Pero no sé cuáles son.
  2. #!/bin/bash& zsh emulate: la primera línea declara que este script se ejecuta en bash. Entonces, ¿por qué hay una emulación, que es de zsh?
  3. alias -g '${1+"$@"}'='"$@"': Acabo de ingresar esto en otro bash y aparece el error: -g :invalid optionEstoy confundido acerca de la diferencia entre zsh y bash y cómo funcionan juntos. ¿Podrías explicármelo, por favor?

Soy nuevo en esto, por lo que es posible que esta pregunta no sea tan "útil" para usted. Pero tu respuesta puede ayudarme a comprender mejor este mundo.

Respuesta1

  1. #!/bin/bash& zsh emulate: la primera línea declara que este script se ejecuta en bash. Entonces, ¿por qué hay una emulación, que es de zsh?

La primera línea, el shebang, solo indica que si el script se ejecuta directamente, se ejecutará usando bash. Nada te impide ejecutarlo usando zsh:

zsh admin.sh

No sé por qué el autor pensó en realizar la prueba de zsh, pero lo hizo. Esta sección de código es para zsh y no se ejecutará en 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+"$@"}'='"$@"': Acabo de ingresar esto en otro bash y aparece el error: -g :invalid optionEstoy confundido acerca de la diferencia entre zsh y bash y cómo funcionan juntos. ¿Podrías explicármelo, por favor?

Esa es una pregunta muy amplia. No explicaré todas las diferencias entre zsh y bash; lea la documentación de ambos para eso. Para el punto específico de alias -g, zsh tieneglobalalias. En bash, los alias sólo se sustituyen al principio de la línea. En zsh, alias -gdefine alias globales que se sustituyen en todas partes de la línea.

Entonces, en zsh, si hago:

alias -g foo=bar

Y luego ejecuta:

echo foo

La salida será:

bar

Respuesta2

A tus preguntas les falta información, pero intentaré responderlas así:

  1. sed regexp desmitificar

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

    Así "se convierte\"

  2. No tengo idea, zsh no es mi taza de té cuando ejecutas scripts.

  3. Pruebe si declaraciones como esta:

    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 
    

información relacionada