我试图了解这个Docker 入口点的作用。
在我看来,这是编写 Dockerfile 时非常常见的模式,但我的 bash 技能有限,而且我不知道所有特殊的 bash 符号功夫。
此外,很难用谷歌搜索“--”、“$!” 等等。这些在 bash 世界中被称为什么?
总而言之,下面的行试图做什么?
if [ "${1#-}" != "$1" ]; then
set -- haproxy "$@"
fi
Run Code Online (Sandbox Code Playgroud) 运行后set -a var=99,我可以在输出中找到一句话set:
...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...
Run Code Online (Sandbox Code Playgroud)
谁能告诉我“_=”是什么意思?
我注意到这echo $var不会给任何东西。如果我运行set -a,则set不会再次包含此变量。怎么了?
set没有参数的命令有什么作用?
正如我所看到的,它像env命令一样打印出我的环境变量,但按字母顺序排列。并进一步打印一些不同的信息(变量?函数?),例如:
__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
quote_readline ()
{
local quoted;
_quote_readline_by_ref "$1" ret;
printf %s "$ret"
}
Run Code Online (Sandbox Code Playgroud)
它是什么,它来自哪里?
我找不到有关set没有参数的命令的信息。实际上,我的 Linux 发行版中根本没有man页面set。
我试图找到这个问题的答案,但到目前为止没有运气:
我有一个运行其他一些脚本的脚本,其中许多其他脚本都包含“set -x”,这使得它们打印执行的每个命令。如果任何脚本将错误消息发送到 stderr,我想摆脱它但保留信息。
所以我不能简单地写 ./script 2>/dev/null
此外,我没有编辑其他脚本的权限,因此我无法手动更改设置选项。
我正在考虑将所有内容从 stderr 记录到单独的文件并过滤掉跟踪命令,但也许有更简单的方法?
在我搜索列出所有 shell 变量的命令时,我以某种方式意识到,有一个命令可以列出所有环境变量,但不知何故,由于我不知道的原因,没有人列出所有 shell 变量。
但是,这里有人给出了如何显示所有变量、shell 和环境变量的答案。
( set -o posix ; set ) | less
Run Code Online (Sandbox Code Playgroud)
他其实并没有为外行解释这个表达是做什么的,我的零碎理解还不足以掌握它背后的想法。
这是我所知道的:
set是某种声明变量的方法,虽然不知道-o posix是什么意思以及为什么要连续执行第二个set
命令 | 少这个不是问题,即使我理解它,它是一个寻呼机,可以更好地控制输出。
bash shell 上的命令指定的“ keyword ”选项到底有什么作用set?
set -o keyword
或者
set -k
一个简单的例子就足够我理解了。
当 set 命令不带任何选项使用时,它会显示所有 shell 变量和函数的名称和值。
我们只想显示变量并避免输出中的函数。
当我用来set -x调试命令时,它会输出一些额外的行。
% set -x
+precmd_update_git_vars:1> [ -n '' ']'
+precmd_update_git_vars:1> [ '!' -n '' ']'
+precmd_update_git_vars:2> update_current_git_vars
+update_current_git_vars:1> unset __CURRENT_GIT_STATUS
+update_current_git_vars:3> [[ python == python ]]
+update_current_git_vars:4> _GIT_STATUS=+update_current_git_vars:4> python /home/ismail/zshfiles/gitstatus.py
+update_current_git_vars:4> _GIT_STATUS=''
+update_current_git_vars:6> __CURRENT_GIT_STATUS=( '' )
+update_current_git_vars:7> GIT_BRANCH=''
+update_current_git_vars:8> GIT_AHEAD=''
+update_current_git_vars:9> GIT_BEHIND=''
+update_current_git_vars:10> GIT_STAGED=''
+update_current_git_vars:11> GIT_CONFLICTS=''
+update_current_git_vars:12> GIT_CHANGED=''
+update_current_git_vars:13> GIT_UNTRACKED=''
+precmd_update_git_vars:3> unset __EXECUTED_GIT_COMMAND
Run Code Online (Sandbox Code Playgroud)
由于这些输出,我无法调试我的命令。
为什么set -x调试我的.zshrc?我set -x只想调试 后面的行set -x。
我通过键入 查找了 shell 内置命令集help set,简短的语法说明显示:
设置 [-abefhkmnptuvxBCHP] [-o 选项名称] [--] [arg ...]
帮助文档解释说,变量 $- 保存使用 set 命令设置的所有当前参数。
所以,我确实echo $-显示了 shell 的所有参数设置,我的是:
他BH
文档和上面的简短语法描述中提到了所有字母,但缺少一个:i选项。i setbash中的参数是什么意思?
是否可以取消设置 $1 变量?如果没有,我无法在man.
[root@centos2 ~]# set bon jour
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]# unset $1
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]#
Run Code Online (Sandbox Code Playgroud)
编辑:
最后,这是我在 man ( man set option double-dash) 中发现的清空所有位置参数的方法(并且 man 使用了“unset”这个词!):
如果此选项后面没有参数,则位置参数未设置。
[root@centos2 ~]# echo $1
[root@centos2 ~]# set bon jour
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]# set --
[root@centos2 ~]# echo $1$2
[root@centos2 ~]#
Run Code Online (Sandbox Code Playgroud)
@Jeff Schaller 的回答帮助我理解了这一点。
set ×10
bash ×6
shell ×3
shell-script ×2
command-line ×1
debugging ×1
subshell ×1
variable ×1
zsh ×1