当输入是变量/子命令或只是键入时,ls(1) 行为异常

当输入是变量/子命令或只是键入时,ls(1) 行为异常

我在 ls(1) 上遇到了一个问题,我几乎可以肯定这是一个愚蠢的问题,我只是让它过去了。无论如何,我真的不明白为什么它不起作用。

我正在为 cygwin 使用 bash(不要问为什么...我只是必须这样做 :( )这是完整的(有意义的)--version 输出: GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)

我一直在使用 cygpath 来转换 unix / windows 路径,这样我就可以大部分时间停留在终端上,同时还能获取 windows 路径,反之亦然。

到目前为止,一切都很好……但 NT 上的一个烦人的事情是,很多路径都有空格和其他不太适合路径的字符,例如( )。为了解决这个问题,我编写了一个单行脚本来转义所有带有反斜杠的路径,因此无论 Windows 对它们设置什么疯狂设置,我都会有一个有效的路径。

到目前为止,一切都还很好...但是后来我遇到了一个问题,ls(1)对路径感到困惑,这很难解释,所以会举一些例子!

## Lets imagine that I want to get the "unix" version of C:\Program Files (x86)
## And for sake of simplicty I'll call the oneliner sript as unix_path.

unix_path "C:\Program Files (x86)"
##  prints /cygdrive/c/Program\ Files\ \(x86\)

my_path=$(unix_path "C:\Program Files (x86)");
echo $my_path;
##  prints /cygdrive/c/Program\ Files\ \(x86\)

## Until now, we're good!
## But the next commands really bugs me...

ls $my_path;
##  ls: cannot access '/cygdrive/c/Program\': No such file or directory
##  ls: cannot access 'Files\': No such file or directory
##  ls: cannot access '\(x86\)': No such file or directory

ls $(unix_path "C:\Program Files (x86)")
##  Same as before...
##  ls: cannot access '/cygdrive/c/Program\': No such file or directory
##  ls: cannot access 'Files\': No such file or directory
##  ls: cannot access '\(x86\)': No such file or directory

ls "$my_path";
##  ls: cannot access '/cygdrive/c/Program\ Files\ \(x86\)': No such file or directory

## Now is very crazy, let's imagine that I type /cygdrive/c/Program\ Files\ \(x86\)
## by hand or just paste it.
ls /cygdrive/c/Program\ Files\ \(x86\)
##   I'll not post but the listing are correct!

我真的不明白为什么当我使用$()或 使用调用 ls(1) 时它不正确$var_name_here,但当我输入路径时它却正确。请注意,两种方式的路径都是相同的!

任何帮助都非常感谢!谢谢!

答案1

因为

ls $my_path;

变成

ls /cygdrive/c/Program Files (x86)

因为反斜杠实际上并不是路径的一部分,它们只是 bash“文字”中的一个技巧。

因此ls给出了三个不同的文件名/cygdrive/c/ProgramFiles(x86)。要ls查看一个带有空格的文件名,请使用:

ls "$my_path"

在实践中,在 bash 中,您会用双引号将所有可以包含空格并且希望被视为单个单元的字符串引起来。$-subtitution 仍然会发生在双引号内(但不会发生在单引号内)

相关内容