这是专门关于bash
的- 在这个答案declare
中对一般情况进行了非常详尽的处理(其中提到“ // , ,的输出”,但没有提到的输出)。typeset
declare
export -p
ksh93
mksh
zsh
bash
给定一个本地/导出/数组/关联数组(但可能不是 nameref)变量, infoo
的输出是否保证可重用?官方文档没有提到类似的内容:declare -p foo
bash
bash
该
-p
选项将显示每个的属性和值name
。当-p
与参数一起使用时,除和name
之外的其他选项将被忽略。-f
-F
我浏览了一下CHANGES
,看到了关于函数的内容:
This document details the changes between this version, bash-2.05-beta1,
and the previous version, bash-2.05-alpha1.
...
b. When `set' is called without options, it prints function definitions in a
way that allows them to be reused as input. This affects `declare' and
`declare -p' as well.
对于其他几个命令,-p
旨在生成可重用的输出:
s. The `shopt' `-p' option now causes output to be displayed in a reusable
format.
...
u. `umask' now has a `-p' option to print output in a reusable format.
Bash-2.0 contained extensive changes and new features from bash-1.14.7.
Here's a short list:
...
most builtins use -p option to display output in a reusable form
(for consistency)
但我找不到任何关于declare -p
变量的信息。
在您提到的我的答案中,其他要点之一也提到:
其中不包括 bash 的
declare -p
.在我写到的时候,答案
bash
并declare -p
没有用于引用标量$'...'
变量的值,但它确实将其用于数组变量。现在情况已经改变,因为我可以看到 5.2 输出包含 BS 字符的标量变量(请参阅邮件列表上的相关讨论)。declare -x a=$'\b'
但是,无论如何,旧版本确实用于
"..."
引用标量变量的值,其中`
和\
是特殊的,并且这些字符具有可以作为某些语言环境中其他字符的编码的一部分找到的编码。的输出
declare -p
是有意的(正如代码中的一些注释以及邮件列表上维护者的声明所暗示的那样)如果没有记录为可重用,但实际上仅(如果有的话)在同一 bash shell 的同一版本中并在同一系统上的同一语言环境中(相同的 libc 和语言环境定义)。在带有 bash 5.0.17 的 Ubuntu 20.04 上:
uname
declare -p
当在使用 UTF-8 作为字符映射的语言环境中获得的输出被在使用 GB18030 作为字符映射的语言环境中运行的 bash 解释时,运行(幸运的是,无害) 。过去已修复了许多错误(请参阅此或此作为示例),其中引用未正确完成,或者
declare -p
(或export -p
POSIX 要求输出适合重新输入的 shell 代码)仅包括来自环境的变量定义无法映射到 shell 变量。另请注意,在 bash 中,有效变量名的构成取决于区域设置。
字节 0xe9 在 ISO-8859-1 中是 é,它是一个单字节
[[:alpha:]]
,因此允许在变量名称中使用,而在 UTF-8 中,它甚至不能形成有效字符。还要注意:
一个是全局的,一个是局部的这一事实并未反映在
declare
的输出中,如果两者都在函数内部使用,则生成的变量最终将成为该函数的局部变量。bash
declare
显然是仿照 ksh 的typeset
(bash 也有一个typeset
别名)。在 ksh86 及更早版本中,typeset -p
是将输出(如果有)打印typeset
到协进程(也称为双向管道)。看来它在 ksh88 中消失了。在 ksh93 中,typeset -p
重新出现打印变量定义。当前版本的 ksh93 手册有:
但这种说法直到2008 年才出现在 ksh93t 中。
-p
declare
在 1996 年发布的 2.0 中被添加到 bash 中从该版本的新闻文件中:
(
-F
与 ksh93 不兼容)还有
CWRU/changelog
:实际实现日期为 1995 年 3 月 24 日,因此在 ksh93 之后但在 ksh93 之前,记录了它生成可重用的输出。
Bash 的很多功能都是从 Ksh 复制的。由于 bash 和 ksh 下具有相同功能的相同开关,因此应该预期 Ksh 答案也适用于 Bash。
我个人的理解是, 的输出
declare -p
是可重用的,而且我还没有见过不可以重用的情况。