我在命令行ls
中运行的基本$ ls [root]/*
命令,我可以从中查看$root
目录的内容。但是,当我在脚本中运行相同的命令时,我看到了这个错误:ls: [root]/*: No such file or directory
。我将粘贴下面的脚本,但有人能够告诉为什么命令在命令行中运行正常而不是脚本吗?谢谢。
#! /bin/bash
root="[root]"
ls "$root/*"
修改
我追查了这个问题。除非我正在寻找具有该名称的文件或目录,否则通配符应该不在双引号内。以下脚本成功运行。
#! /bin/bash
root="[root]"
ls "$root/"*
答案 0 :(得分:0)
这里有一些问题。
[root]
是一个shell globbing模式,可匹配三个字符r
,o
或t
中的任何一个。如果您执行ls [root]
并且您碰巧有一个名为r
,o
或t
的目录或文件,那么该模式将扩展为该文件或目录的名称。
为了安全地列出真实姓名为[root]
的目录的内容,您需要引用该名称,这将我们带到下一个点......
shell globbing模式不会在引号中展开。这意味着"[root]/*"
在*
目录中引用名为[root]
的内容。
您的脚本必须看起来像
#!/bin/sh
root='[root]'
ls "$root"/*
答案 1 :(得分:0)
我的问题的最佳答案是我对我的问题所做的编辑。我再说一遍。
我想在bash脚本中使用ls
通配符并编写此文件:
#! /bin/bash
root="[root]"
ls "$root/*"
但是,以这种方式编写ls
会查找名为*
的文件或目录。为了使用通配符,我需要将*
留在引号之外。请参阅以下示例:
#! /bin/bash
root="[root]"
ls "$root/"*
注意:强>
我在问题中使用方括号[]
并在上下文中回答。我的目录名称不是文字字符串[root]
,而是其他内容,但方括号让读者理解上下文中的内容。
但是将来假冒的根路径或名称可能更好。