终端无法运行存储在 PATH 目录中的 shell 脚本文件
Posted
技术标签:
【中文标题】终端无法运行存储在 PATH 目录中的 shell 脚本文件【英文标题】:Terminal cannot run shell script files stored in PATH directories 【发布时间】:2015-05-27 13:06:37 【问题描述】:尝试运行 shell 脚本文件时出现“找不到命令”。该文件本身存储在一个目录中,该目录已添加到 PATH 中,但终端仍然无法将其识别为 shell 脚本。
这是我尝试的顺序:
tajimura/GAMIT% echo $PATH
/usr/local/bin:/usr/bin:/bin:/user/games:/usr/X11R6/bin:/usr/bin/X11:/usr/lib64/jvm/jre/bin:/home/tajimura/GAMIT/gamit/bin:/home/jaimura/GAMIT/kv/bin:/home/tajimura/GAMIT/com
tajirmura/GAMIT% ls /home/tajimura/GAMIT/com/sh_steup
/home/tajimura/GAMIT/com/sh_setup
tajimura/GAMIT% sh_setup
sh_setup: Command not found.
tajimura/GAMIT% sh sh_setup
sh: sh_setup: No such file or directory
tajimura/GAMIT% l /home/tajimura/GAMIT/com/sh_setup
-rwxr-xr-x 1 tajimura users 11109 Aug 20 2013 /home/tajimura/GAMIT/com/sh_setup
这是截图:
PS:此处使用 Opensuse 12.1。
添加:前 4 天我执行得很好,所以我想 hashbang 不是问题。但我不能保证工作站在我的会话之间没有重新启动,所以也许(只是可能) -noexec 是原因。但是,脚本位于我的硬盘主目录中,它不是可移动驱动器。
添加:sh_setup 的前五行:
/home/tajimura% sed 5q /home/tajimura/GAMIT/com/sh_setup
#!/bin/csh -f
#
#doc Check and setup the GAMIT tables directory
#doc
#
【问题讨论】:
文件夹GAMIT
和com
是否具有所需的文件系统权限?
1.告诉我们什么是 sh_setup
很确定sh sh_setup
失败了,因为您不在com
中。第一个(只是sh_setup
)可能是sh_setup
是一个损坏的符号链接。
残酷的错误信息表明(t)csh
正在使用中(其他shell在消息前加上shell,并给出不同的消息)。最大的可能性是sh_setup
所在的文件系统是用noexec
挂载的(例如,从一个随身碟)。如果您执行grep `stat --format=%m /home/tajimura/GAMIT/com/sh_setup` /proc/mounts
,您可能会在该行中找到noexec
。执行sudo mount -o remount,exec - <mountpoint>
,文件应该是可执行的。
向我们展示您脚本的前 5 行 (sed 5q /home/tajimura/GAMIT/com/sh_setup
)。它工作的时间和停止工作的时间之间发生了什么变化?发生了一些变化,即使你还不知道发生了什么,追踪它可能是至关重要的。您是否删除或重命名了任何内容?
【参考方案1】:
您的脚本 要么不可执行(使用 在其 hash-bang 行(@987654322 的第一行)上指定了一个损坏的(不存在的)解释器@文件,以chmod +x sh_setup
使其如此)要么#!
开头)。
您的 sh sh_setup
调用失败,因为它没有使用 $PATH
并且您在错误的目录中。
编辑:您的脚本显然是可执行的(起初我没有在您的屏幕截图中发现这一点),这给我们留下了一个可能不正确的解释器。
【讨论】:
【参考方案2】:我发现了一个意想不到的问题解决方案。如果我在 bash 而不是 csh 下调用脚本,一切都很好。
【讨论】:
以上是关于终端无法运行存储在 PATH 目录中的 shell 脚本文件的主要内容,如果未能解决你的问题,请参考以下文章