【问题标题】:"ls: not found" after running "read PATH"运行“读取路径”后出现“ls: not found”
【发布时间】:2015-04-03 08:07:17
【问题描述】:

我正在尝试编写一个小脚本来列出给定变量中的目录。 但是,在将我的输入读入变量PATH 后,我根本无法运行ls

#!/system/bin/sh 
echo "enter directory for listing"
read "PATH"

ls "$PATH" -R > list.txt

退出:

ls: not found

...并且什么都不写到list.txt

【问题讨论】:

  • 不要使用PATH 你正在炸毁$PATH 变量,这是shell 查找要运行的命令的方式。通常不要使用任何 ALL_CAPS 变量。这些是为外壳/等“保留”的。用法。告诉我们您的实际错误是什么也会很有帮助。
  • @JONAS402,...Etan 已经告诉过你原因和解决方法。
  • @JONAS402... 将变量从 PATH 重命名为 path,就完成了。 PATH 变量用于确定在哪里寻找可执行文件;覆盖它,shell就找不到ls了。
  • ...所以,这与使用“变量”无关,而是关于特定的变量名称
  • 是的,我知道你遇到了什么错误,但我的意思是我不应该弄清楚。你应该把它包括在内,因为这是你问题的重点。

标签: shell scripting sh


【解决方案1】:

变量名称PATH 已为不同的目的保留:它列出了所有可能搜索的位置,以查找未内置于 shell 中的命令。

ls 就是这样一个命令。因此,当您更改PATH 的值时,您会更改shell 尝试查找ls 可执行文件的方式;除非PATH 的新值包含一个包含ls 可执行文件的目录,否则任何进一步尝试运行ls(或未内置到shell 中的其他命令)都会失败。

改为使用不同的变量名——理想情况下,至少包括一个小写字符,以避免与(全大写)内置函数和环境变量发生冲突。


因此,一种更正的形式可能是:

#!/system/bin/sh 
echo "enter directory for listing"
IFS= read -r path

ls -R -- "$path" > list.txt

请注意,在这种情况下,-R 移动到 "$path" 之前——虽然 GNU 系统允许可选参数位于位置参数之后,但许多旧 UNIX 系统只会将标志(如 -R)视为有效如果在第一个非标志/选项参数之前找到它们。

【讨论】:

  • 这里有非常好的建议。请注意,在这种情况下,$pathzsh 中也很特殊(它是一个绑定到$PATH 的数组,就像在csh 中一样),所以你会在zsh 那里遇到同样的问题(不是当zshsh 仿真时)。
  • 另请注意,如果环境中有 POSIXLY_CORRECT 变量,即使 GNU ls 也不会接受参数后的选项。
【解决方案2】:

我通过重置 iTerm 2 来修复它。

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 2020-07-09
    • 2017-11-25
    • 2015-11-22
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多