Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了linux – Bash内置命令的“a = b”类参数中的文件名扩展大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我已经了解到,在 Bash中运行命令时,在命令执行之前完成文件名扩展.但是在尝试下面的命令时(使用-x选项): touch foo=3 # Create a file with name "foo=3" + touch foo=3 declare foo=? + declare 'foo=?' alias foo=* + alias 'foo=*' 我得不到我的期望,因为foo =?并且fo
我已经了解到,在 Bash中运行命令时,在命令执行之前完成文件名扩展.但是在尝试下面的命令时(使用-x选项):
touch foo=3    # Create a file with name "foo=3"
+ touch foo=3
declare foo=?
+ declare 'foo=?'
alias foo=*
+ alias 'foo=*'

我得不到我的期望,因为foo =?并且foo = *未扩展为文件名“foo = 3”:

declare -p | grep 'foo='    # => foo='?'
alias | grep 'foo='         # => alias foo='*'

但是如果我运行另一个类似cd的内置函数或接受赋值作为自己编写的参数的函数,如show_rhs(){echo“${1%= *} =’${1#* =}’”;我得到了我期望的东西(foo =?和foo = *被扩展).

cd foo=?            # => foo=3: Not a directory
show_rhs() foo=*    # => foo='3'

在这里看到的唯一区别是declare和alias是内置函数并接受赋值作为参数.根据-x选项的输出,似乎添加了一对引用以在文件名扩展之前包含赋值.

但是如果文件名扩展在命令执行之前运行而不管命令是什么,那么传入declare和alias的参数应该是foo = 3而不是foo =?和foo = *由于存在文件“foo = 3”.

那么Bash在文件名扩展之前根据命令做一些特殊的事情(可能引用通配符?)到“a = b”类似的参数?

(我的环境:CentOS 5.8 64bit,GNU Bash 3.2.25)

解决方法

Bash以一种不严格符合Posix标准的方式解析它的一些内置命令,也没有很好地记录.

特别是,接受这些参数(别名,声明,导出,本地,只读和排版)的命令中的赋值参数不受路径名扩展或字拆分的限制. (这是通过抑制扩展而在内部完成的,而不是通过引用元字符来完成,尽管不容易看到实现细节如何变得可见.)

即使在Posix模式下启动bash或sh也是如此.

请注意,抑制路径名扩展仅适用于看起来像赋值的参数.从问题中扩展示例:

touch foo=3    # Create a file with name "foo=3"
+ touch foo=3
declare foo=?
+ declare 'foo=?'

bar="foo=?"    # Put the declare argument in a variable
+ bar='foo=?'
declare $bar
+ declare foo=3

正如预期的那样,破折号路径名会扩展并将字段拆分为别名和导出的参数,与Posix规范一致.所以,显然,zsh.

除了在Posix模式下,bash还会向参数的右侧扩展 – 看起来像赋值.在Posix模式下,它将此限制为上面列出的内置函数的赋值参数,尽管Posix仅在命令字之前的变量赋值中指定=之后的波浪扩展.这就是破折号所做的,但是zsh将其扩展为“排版族的命令”(记录在zsh manual中).

大佬总结

以上是大佬教程为你收集整理的linux – Bash内置命令的“a = b”类参数中的文件名扩展全部内容,希望文章能够帮你解决linux – Bash内置命令的“a = b”类参数中的文件名扩展所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。