获取 bash 脚本后无法找到命令

获取 bash 脚本后无法找到命令

我有一个简短的 bash 脚本cdline,它接受两个参数PATHS并将LINE目录更改为相应LINEPATHS

#!/bin/bash
#command for changing directory to that in the given line...
#or that of the file in the given line

PATHS=$1
LINE=$2
PATH="$(echo "${PATHS}" | sed -n ${LINE}p)"
PATH="$(/home/gohomology/Scripts/pc_macros/file_system/getdir "${PATH}")"
cd ${PATH}

return 1

如果它是一个目录,则调用它getdir回显给定的路径,否则回显包含该文件的目录。

我知道,当调用 bash 脚本时,它通常会创建一个子 shell,因此尝试调用该脚本通常不会执行任何操作。据我了解,解决方案应该是采购脚本,可以在调用脚本之前添加.或添加脚本。source

这确实适用于更改目录,但是,这样做后,我的终端找不到各种命令,例如lsfind,如我的终端模拟器的以下结果所示。

gohomology@gohomology:~/Desktop$ find . -name "example_file"
./example_dir/example_file

gohomology@gohomology:~/Desktop$ . cdline "$(!!)" 1
. cdline "$(find . -name "example_file")" 1

gohomology@gohomology:~/Desktop/example_dir$ ls
Command 'ls' is available in the following places
 * /bin/ls
 * /usr/bin/ls
The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.
ls: command not found

gohomology@gohomology:~/Desktop/example_dir$ find . -name "example_file"
Command 'find' is available in the following places
 * /bin/find
 * /usr/bin/find
The command could not be located because '/bin:/usr/bin' is not included in the PATH environment variable.
find: command not found

cd使用后该命令仍然有效cdline。我认为问题是我被困在 bash shell 中,这就是为什么return 1末尾有 的原因cdline,但问题仍然存在。

我在 Ubuntu 22.04.2 上运行 bash 5.1.16 和 gnome-terminal。

答案1

问题是您的脚本覆盖了您的PATH环境变量:

PATH="$(echo "${PATHS}" | sed -n ${LINE}p)"
PATH="$(/home/gohomology/Scripts/pc_macros/file_system/getdir "${PATH}")"

如果您查看手册页,bash您会看到该变量的用途:

小路

命令的搜索路径。它是一个以冒号分隔的目录列表,shell 在其中查找命令(请参阅命令执行以下)。

然后后来在命令执行部分:

如果名称既不是 shell 函数也不是内置函数,并且不包含斜杠,巴什搜索每个元素小路包含该名称的可执行文件的目录。

由于您的PATH目录已被覆盖,现在仅包括您当前的工作目录,bash因此不知道在哪里查找该命令。

您看到的错误清楚地说明了问题:

The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.

你成功的原因cd是这cd不是一个bash运行的可执行文件,它是一个bash 内置命令。

最重要的是,不要PATH在脚本中使用变量名称,请使用bash.

答案2

PATH是一个特殊变量,它告诉 shell 在哪里查找命令,不要将其用作脚本中的临时变量。

man bash.1

小路

命令的搜索路径。它是一个以冒号分隔的目录列表,shell 在其中查找命令(请参阅下面的命令执行)。 PATH 值中的零长度(空)目录名指示当前目录。空目录名称可能显示为两个相邻的冒号,或者开头或结尾的冒号。默认路径与系统相关,由安装 bash 的管理员设置。常见的值是“/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin”。

相关内容