「管理者」スクリプトで何か混乱しています

「管理者」スクリプトで何か混乱しています

オープンソース パッケージをダウンロードしましたmake。しかし、スクリプトを実行して開始しようとするとエラーが発生しますadmin。 に関する問題であることが分かりましたpath。しかし、まだ混乱している問題が残っています。

#! /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: それはどのような価値を持っていますか? の存在により''、 の一部のメタが''無効になっています。 しかし、どれが無効になっているのかわかりません。
  2. #!/bin/bash& zsh emulate: 最初の行は、このスクリプトが bash で実行されていることを宣言しています。では、なぜ zsh からの emulate があるのでしょうか?
  3. alias -g '${1+"$@"}'='"$@"': 別の bash でこれを入力すると、エラーが発生します: -g :invalid option、zsh と bash の違い、およびこれらがどのように連携するかについて混乱しています。説明していただけますか?

私はこの分野の初心者なので、この質問はあなたにとってそれほど「役に立つ」ものではないかもしれません。しかし、あなたの答えは私がこの世界をよりよく理解するのに役立ちます。

答え1

  1. #!/bin/bash& zsh emulate: 最初の行は、このスクリプトが bash で実行されていることを宣言しています。では、なぜ zsh からの emulate があるのでしょうか?

最初の行のシェバンは、スクリプトが直接実行される場合、bash を使用して実行されることを示しているだけです。zsh を使用して実行することを妨げるものは何もありません。

zsh admin.sh

著者がなぜ zsh をテストしようと考えたのかは分かりませんが、彼らはそうしました。このコードセクションは zsh 用であり、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+"$@"}'='"$@"': 別の bash でこれを入力すると、エラーが発生します: -g :invalid option、zsh と bash の違い、およびこれらがどのように連携するかについて混乱しています。説明していただけますか?

それは非常に幅広い質問です。zshとbashの違いをすべて説明するつもりはありません。それについては両方のドキュメントを読んでください。具体的な点についてはalias -g、zshにはグローバルエイリアス。bash では、エイリアスは行の先頭でのみ置換されます。zsh では、alias -g行のどこでも置換されるグローバル エイリアスを定義します。

したがって、zsh で次のようにすると、

alias -g foo=bar

そして、以下を実行します:

echo foo

出力は次のようになります。

bar

答え2

質問には情報が不足していますが、次のように回答してみます:

  1. sed 正規表現の謎を解く

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

    つまり"\"

  2. わかりません。スクリプトを実行する場合、zsh は私には向いていません。

  3. 次のような if ステートメントをテストします。

    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 
    

関連情報