Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash是否存在版本问题,会阻止我执行文件?_Bash - Fatal编程技术网

Bash是否存在版本问题,会阻止我执行文件?

Bash是否存在版本问题,会阻止我执行文件?,bash,Bash,我创建了一个bashshell脚本文件,可以在本地bash(版本4.2.10)上运行,但不能在远程计算机(版本3.2)上运行。这就是我要做的 本地文件夹中存在脚本文件(some_script.sh) 我已经做了$chmod755一些_script.sh,使它成为一个可执行文件 现在,我试试$。\u script.sh 在我的电脑上,这个运行正常。在远程计算机上,这将返回一个“未找到命令”错误: /some\u script.sh:未找到命令。 此外,在远程版本中,可执行文件的名称后面有星号(

我创建了一个bashshell脚本文件,可以在本地bash(版本4.2.10)上运行,但不能在远程计算机(版本3.2)上运行。这就是我要做的

  • 本地文件夹中存在脚本文件(some_script.sh)
  • 我已经做了
    $chmod755一些_script.sh
    ,使它成为一个可执行文件
  • 现在,我试试
    $。\u script.sh
在我的电脑上,这个运行正常。在远程计算机上,这将返回一个“未找到命令”错误:
/some\u script.sh:未找到命令。

此外,在远程版本中,可执行文件的名称后面有星号(*)。我不知道这是否有什么不同,但当我包括星星时,我仍然会得到相同的错误

这是因为bashshell版本吗?有什么办法让它工作吗


谢谢

未找到
命令
消息可能有点误导。讨论中的“命令”可以是您试图执行的脚本,也可以是shebang行中指定的shell

例如,在我的系统上:

% cat foo.sh
#!/no/such/dir/sh

echo hello
% ./foo.sh
./foo.sh: Command not found.
/foo.sh
明显存在;不存在的是解释器
/no/so/dir/sh
。(我发现错误消息因调用
foo.sh
的shell而异)

因此,几乎可以肯定的是,您在
some_script.sh
的第一行指定了错误的解释器名称。可能
bash
安装在不同的位置(通常是
/bin/bash
,但并不总是如此)

至于可执行文件名中的
*
字符,它们实际上不是文件名的一部分。
ls
命令的
-F
选项使其在某些类型的文件后显示特殊字符:
*
用于可执行文件,
/
用于目录,
@
用于符号链接,等等。可能在远程系统上,您的
ls
别名为
ls-F
或类似名称。如果您键入
/bin/ls
,绕过别名,您应该会看到没有附加
*
字符的文件名;如果键入
/bin/ls-F
,则应再次看到
*
s

在命令名中添加一个
*
字符并不能完成您认为它正在做的事情,但可能不会有任何区别。例如,如果您键入

./some_script.sh*
*
是一个通配符,命令名扩展为当前目录中名称与模式匹配的所有文件的列表(这与
*
ls-F
输出中作为可执行文件的含义完全不同)。可能只有一个这样的文件,所以
/some\u script.sh*
可能等同于
/some\u script.sh
。但不要键入
*
;这是不必要的,可能会导致意外结果。

未找到
命令消息可能有点误导。讨论中的“命令”可以是您试图执行的脚本,也可以是shebang行中指定的shell

例如,在我的系统上:

% cat foo.sh
#!/no/such/dir/sh

echo hello
% ./foo.sh
./foo.sh: Command not found.
/foo.sh
明显存在;不存在的是解释器
/no/so/dir/sh
。(我发现错误消息因调用
foo.sh
的shell而异)

因此,几乎可以肯定的是,您在
some_script.sh
的第一行指定了错误的解释器名称。可能
bash
安装在不同的位置(通常是
/bin/bash
,但并不总是如此)

至于可执行文件名中的
*
字符,它们实际上不是文件名的一部分。
ls
命令的
-F
选项使其在某些类型的文件后显示特殊字符:
*
用于可执行文件,
/
用于目录,
@
用于符号链接,等等。可能在远程系统上,您的
ls
别名为
ls-F
或类似名称。如果您键入
/bin/ls
,绕过别名,您应该会看到没有附加
*
字符的文件名;如果键入
/bin/ls-F
,则应再次看到
*
s

在命令名中添加一个
*
字符并不能完成您认为它正在做的事情,但可能不会有任何区别。例如,如果您键入

./some_script.sh*
*
是一个通配符,命令名扩展为当前目录中名称与模式匹配的所有文件的列表(这与
*
ls-F
输出中作为可执行文件的含义完全不同)。可能只有一个这样的文件,所以
/some\u script.sh*
可能等同于
/some\u script.sh
。但不要键入
*
;这是不必要的,可能会导致意外的结果。

检查脚本顶部的行。此处指示的
bash
位置是否与另一个系统上的位置相同?健全性检查,您试图运行它的远程文件系统上的脚本是否正确?对于此错误,这应该无关紧要。因为它甚至不读取文件。但是,我确实把bash引用放错了地方…@Alex,是的,是的,谢谢:)我很困惑你是如何得到“Command not found”error的,但是如果你说远程系统上的文件名后面附加了星号(在一些shell中标记可执行文件),我假设您看到了试图在远程计算机上运行的脚本。您还可以再次检查脚本在远程系统上是否具有+x模式,以及脚本是否位于您正在ssh的用户的默认主目录中。请检查脚本顶部的行。此处指示的
bash
位置是否与另一个系统上的位置相同?健全性检查,您试图运行它的远程文件系统上的脚本是否相同