![“管理员”脚本中有些令人困惑的地方](https://linux22.com/image/1052904/%E2%80%9C%E7%AE%A1%E7%90%86%E5%91%98%E2%80%9D%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%9C%89%E4%BA%9B%E4%BB%A4%E4%BA%BA%E5%9B%B0%E6%83%91%E7%9A%84%E5%9C%B0%E6%96%B9.png)
我下载了一个开源软件包和。但是当我运行脚本试图开始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
sed_quote_subst
:它有什么价值?由于 的存在''
, 中的一些元信息''
被禁用。但我不知道它们是什么。#!/bin/bash
& zsh emulate:第一行声明这个脚本在 bash 中运行。那么,为什么有一个来自 zsh 的 emulate 呢?alias -g '${1+"$@"}'='"$@"'
:我刚刚在另一个 bash 上输入了这个并得到错误:-g :invalid option
,我对 zsh 和 bash 的区别以及它们如何协同工作感到困惑。你能给我解释一下吗?
我是这方面的新手,所以这个问题对你来说可能不是那么“有用”。但你的回答可以帮助我更好地理解这个世界。
答案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
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
您的问题缺乏信息,但我会尝试这样回答:
sed 正则表达式揭秘
s/\([`"$\\]\)/\\\1/g' ^ ^ ^----------------- with The character with a leading \ | | | --- the characters `"$\ | |-- replace
因此
"
变成\"
我不知道,当运行脚本时,zsh 不合我的口味。
测试 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