“管理员”脚本中有些令人困惑的地方

“管理员”脚本中有些令人困惑的地方

我下载了一个开源软件包和。但是当我运行脚本试图开始make时,发生了错误。我发现这是关于的一些问题。但仍然有一些问题让我困惑:adminpath

#! /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 呢?

第一行,shebang,仅表示如果直接执行脚本,它将使用 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 
    

相关内容