mv:从修改 PATH 变量的脚本执行时未找到

use*_*est 4 bash path shell-script variable

我的脚本中有这个。但是正在返回错误。如果我在控制台中执行命令工作正常

./script.sh[16]: mv: not found [No such file or directory]
Run Code Online (Sandbox Code Playgroud)

我想将一些以 T353 开头的文件从一个文件夹移动到另一个文件夹。REMOTE_PATH是 /tmp/,PATH是我的工作目录

cd $REMOTE_PATH
mv T353* $PATH #this is the line 16
Run Code Online (Sandbox Code Playgroud)

如果我make mv /tmp/T353* .工作正常。

Kus*_*nda 20

您似乎PATH在脚本中使用了该变量。这恰好是 shell 用来查找可执行文件的变量。这意味着,如果您将其更改为不是以 -:分隔的路径列表的其他内容,或者更改为不包含脚本使用的可执行文件的路径,shell 可能不再找到类似mv或其他标准实用程序的内容。

出于这个原因,最好在 shell 脚本变量中使用小写字母(这是一个品味问题1),或者至少要意识到 shell 用于各种事情的变量,并且您应该避免修改这些,除非,当然,您想改变 shell 的行为。

Bash 使用的变量列在 Bash 手册的“Shell 变量”标题下。

顺便说一句,cd上面的行确实有效。这是因为它是一个内置于 shell 本身的特殊实用程序。因此,shell 不必查看$PATH它的位置。

顺便说一句,你说那$PATH是你的工作目录。shell 已经将当前工作目录存储在$PWD.

作为旁注,养成双引号变量的习惯。请参阅“忘记在 bash/POSIX shell 中引用变量的安全隐患”。


1 好吧,大多数情况下,但 POSIX 标准为shell 和标准实用程序集合使用的环境变量(即导出的 shell 变量)保留了大写变量的命名空间。AFAIK,它不允许在非导出的 shell 变量中使用大写字符,但定义命名空间的全部目的是避免冲突。由于对于脚本而言,环境变量和 shell 变量具有相同的语义,因此最好完全避免使用大写变量。

  • @userGuest 如果您没有问过,您就不会(这么快)弄明白,所以不要难过。:-) (3认同)
  • 虽然避免使用 ALL_CAPS 变量是一个好主意(我的偏好是 CamelCase,因为我从未见过使用它的系统定义变量,它为我节省了下划线以使名称易于阅读),但使用更有意义的变量也很好名称而不仅仅是“路径”。我会有 $Source 和 $Dest 或类似的东西。 (3认同)
  • 我对此感到难过:( 适用于路径而不是 PATH (2认同)