我有一个简短的 bash 脚本cdline
,它接受两个参数PATHS
并将LINE
目录更改为相应LINE
的PATHS
:
#!/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
这确实适用于更改目录,但是,这样做后,我的终端找不到各种命令,例如ls
或find
,如我的终端模拟器的以下结果所示。
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”。