为何我的 Bash 脚本无法运行?

为何我的 Bash 脚本无法运行?

我对 Mac OSX 中的终端越来越熟悉了,我想尝试一下 bash 脚本。我不想在坐下之前就爬起来,所以我想写一个非常简单的“Hello, world!”脚本,所以我做了这个:

~/Desktop touch hello.sh
~/Desktop vim hello.sh

然后我将其添加到 hello.sh

#!/bin/bash
echo "Hello, world!"

然后我这样做了:

~/Desktop chmod -x hello.sh
~/Desktop hello

这时什么也没有发生。

我从某处下载了一个同样简单的 bash 脚本,内容如下:

#!/bin/bash
echo "The current date and time."
date

当我这么做的时候

~/Desktop date

它确实做了它应该做的事。

然后我使用 ls -l 检查了文件权限,得到了以下结果:

-rw-r--r--    1 Mike  staff       33  5 Sep 21:13 hello.sh
-rw-r--r--@   1 Mike  staff       50  5 Sep 21:00 date.sh

所以很明显 @ 造成了所有不同,至少我是这么认为的。我没有使用 vim,而是在 TextEdit 中创建了相同的文件,在执行了与之前相同的操作后,我得到了相同的情况,即我的脚本什么也没做,只是现在权限在末尾显示了一个 @。

所以我的问题是为什么这不起作用,我做错了什么?权限末尾的 @ 是什么?

答案1

首先,你必须添加“执行”权限位。使用chmod +x可添加或chmod -x删除该权限位。

其次,在 Unix 中,你必须使用精确的文件名。如果文件名为hello.sh,则必须通过hello.sh不是 hello(您可能已经习惯了 Windows 及其 %PATHEXT%,这在 Unix 中并不存在。这里只考虑执行位,.sh对系统来说毫无意义——文件如果您愿意,可以简单地命名hello

第三,默认当前目录是不是搜索命令(出于安全原因)。脚本必须位于您的 $PATH 中,或者您必须通过其完整路径名运行它。使用.(表示“当前目录”)就足够了。

~/桌面 chmod + x hello.sh
~/桌面 ./你好.sh
你好世界!
~/桌面 ~/桌面/hello.sh
你好世界!
~/桌面

./hello.sh表示“hello.sh在当前目录中”。)

当你输入时date,你确实不是运行你自己的脚本;你运行了系统的命令(就像你输入 时date运行系统的命令一样)。chmodchmod@不是在这里有所作为。

@字符仅表示与该文件相关的“扩展元数据”的存在;很可能是 TextEdit 特有的东西。根据ls(1)手册页,您可以使用ls -l -@ls -l@)查看元数据。

相关内容