Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zsh 分配非数组变量时的文件名扩展_Zsh - Fatal编程技术网

Zsh 分配非数组变量时的文件名扩展

Zsh 分配非数组变量时的文件名扩展,zsh,Zsh,这是关于Zsh 5.5.1的 假设我有一个glob模式,它只扩展到一个文件,我想把这个文件分配给一个变量。这项工作: # N: No error if no files match. D: Match dot files. Y1: Expand to exactly one entry. myfile=(*(NDY1)) 并且echo$myfile将显示该文件(或目录)。但这一条不起作用: myfile=*(NDY1) 在后一种情况下,echo$myfile保存模式,即*(NDY1) 当然

这是关于Zsh 5.5.1的

假设我有一个glob模式,它只扩展到一个文件,我想把这个文件分配给一个变量。这项工作:

# N: No error if no files match. D: Match dot files. Y1: Expand to exactly one entry.
myfile=(*(NDY1)) 
并且
echo$myfile
将显示该文件(或目录)。但这一条不起作用:

myfile=*(NDY1)
在后一种情况下,
echo$myfile
保存模式,即
*(NDY1)

当然,我可以做一些便宜的把戏,比如通过

myfile=$(echo *(NDY1))

但是有没有一种方法可以在没有这些技巧的情况下进行辅助?

默认情况下,zsh在标量赋值中不进行文件名扩展,但是该选项可能会有所帮助。(此选项仅用于向后兼容。)

以下是zsh文档中的一些描述:

标量参数的值也可以通过写入来指定:
name=value

在标量赋值中,值被扩展为单个字符串,其中数组的元素连接在一起;除非设置了该选项,否则不会执行文件名扩展

---



如果设置了此选项,将在“
name=pattern
”形式的标量参数赋值的右侧执行文件名生成(globbing)(例如
foo=*
”)。如果结果包含多个单词,则参数将成为一个数组,并将这些单词作为参数。此选项仅用于向后兼容:全局搜索始终在
name=(value)
(例如
foo=(*)
)表单的数组分配右侧执行,为清晰起见,建议使用此表单;设置此选项后,无法预测结果是数组还是标量

---


您是否认为
$myfile
${myfile[1]}
之间的区别很重要?我只想继续数组赋值。@chepner:Yes:如果
myfile
是一个数组,
$myfile[1]
将展开到数组的第一个元素(在本例中仅为文件名)。如果是标量,
$myfile[1]
将扩展到文件名的第一个字符。这与此无关,因为您有一个数组。我的问题是,为什么不使用数组?@chepner。正是为了这个:我想在以后的代码中使用这个变量,我想像使用任何其他标量一样使用它(包括使用下标)。从维护的角度来看,必须始终记住哪些变量是标量,哪些是单元素数组是不好的。当然,我可以做一个
myfile=$myfile[1]
,然后去掉数组,但我的问题是,Zsh是否提供了更干净的方法,它在各种构造中都非常丰富。
local myfile=''
() {
  setopt localoptions globassign
  myfile=*(NDY1)
}
echo $myfile
;#>> something