为什么我的 bash 脚本不起作用?

pun*_*lly 2 mac unix terminal bash shell-script

我对 Mac OSX 中的终端越来越熟悉,我想我会涉足 bash 脚本。不想在我坐下之前爬行,我想写一个非常简单的“你好,世界!” 脚本所以我这样做了:

~/Desktop touch hello.sh
~/Desktop vim hello.sh
Run Code Online (Sandbox Code Playgroud)

然后我将它添加到 hello.sh

#!/bin/bash
echo "Hello, world!"
Run Code Online (Sandbox Code Playgroud)

然后我这样做了:

~/Desktop chmod -x hello.sh
~/Desktop hello
Run Code Online (Sandbox Code Playgroud)

此时什么都没有发生。

我从某个地方下载了一个同样简单的 bash 脚本:

#!/bin/bash
echo "The current date and time."
date
Run Code Online (Sandbox Code Playgroud)

当我这样做的时候

~/Desktop date
Run Code Online (Sandbox Code Playgroud)

它做了它应该做的。

然后我用 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
Run Code Online (Sandbox Code Playgroud)

很明显@ 正在发挥作用,或者我是这么认为的。我没有使用 vim,而是在 TextEdit 中创建了相同的文件,在经历了与之前相同的动作之后,我最终遇到了相同的情况,即我的脚本除了现在权限在它们末尾显示一个 @ 之外什么也没做。

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

use*_*686 8

首先,您必须添加“执行”权限位。使用chmod +x添加它,chmod -x删除它。

其次,在 Unix 中您必须使用确切的文件名。如果文件已命名hello.sh,则必须由 运行它hello.sh而不是 hello. (你可能已经习惯了 Windows 和它的 %PATHEXT%,它在 Unix 中不存在。这里,只考虑执行位.sh,对系统没有意义——如果你愿意,可以简单地命名文件hello。)

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

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

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

当你键入date,你也不能运行你自己的脚本; 您运行了系统的date命令(就像您chmod在键入 时运行系统的命令一样chmod)。在这里@没有什么不同。

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