HOWTO · Bash
在终端中运行 Bash 脚本
这演示了使用 bash 命令在终端中运行 bash 脚本并使其可执行的方法。
本页内容
在 Linux 终端中运行 Bash 脚本,可以使用 bash script.sh。若要直接启动脚本,请先使用 chmod +x script.sh 授予执行权限,再运行 ./script.sh。
使用 bash 运行 Bash 脚本
你可以让 Bash 直接读取脚本文件。临时运行脚本,或不想更改文件的执行权限时,这种方式很方便。不过,你的账户仍须有权读取该文件,而且系统必须已安装 Bash。
下面的独立示例会在临时目录中创建一个小脚本,用 bash 运行它,并在结束后删除临时文件。实际使用时,请将临时路径替换为脚本所在路径,并传入脚本所需的参数。
运行此示例:
本节中的代码以及显示的标签或输出仍为英文。
script=$(mktemp)
trap 'rm -f "$script"' EXIT
cat > "$script" <<'SCRIPT'
#!/usr/bin/env bash
printf 'Hello, %s!\n' "$1"
SCRIPT
bash "$script" Ada
Hello, Ada!
如果文件位于其他目录,请将路径传给 Bash,例如 bash ~/scripts/report.sh。如果路径中包含空格,请用引号括起整个路径:bash "$HOME/my scripts/report.sh"。在 bash 后指定脚本来运行时,无须为文件设置执行权限。脚本中的命令仍以你的用户权限运行,因此这种方式不会授予额外的系统访问权限。
使用 chmod 使 Bash 脚本可执行
如果要反复运行某个脚本,可以为文件所有者授予执行权限,然后通过路径启动它。首先,确认文件以指定可用解释器的 shebang 开头,常见写法是 #!/usr/bin/env bash。接着,在脚本所在目录运行 chmod +x script.sh,再用 ./script.sh 启动脚本。
chmod 命令会修改文件的权限位;通常不会打印成功提示。./ 会告诉 shell 在当前目录中查找 script.sh。这很重要,因为输入不带路径的命令名时,shell 通常不会搜索当前目录。你也可以使用绝对路径或相对路径,例如 ~/scripts/script.sh。
直接执行时,系统会根据脚本的 shebang 选择解释器。因此,shebang 必须有效,而且对应的解释器必须可用。使用 bash script.sh 调用脚本时,Bash 会读取脚本,不受 shebang 影响;直接执行则依赖 shebang。两种方式都使用相同的用户权限。只有在直接执行时的 shebang 选择 Bash,且两次运行的相关执行条件相同时,同一文件和相同参数才会产生相同输出。如果 shebang 选择了其他解释器,直接执行的行为可能与使用 bash script.sh 不同。
选择运行方式并排查常见问题
如果只打算运行一次、不拥有文件的权限,或想明确指定 Bash,请使用 bash script.sh。如果要反复运行并希望命令更简短,请先运行 chmod +x script.sh,再使用 ./script.sh。除非之后文件权限发生变化,否则只需授予一次执行权限。使用 Bash 运行时,每次都无须修改权限;直接执行则需要执行权限。
如果 Bash 提示无法打开文件,请用 pwd 和 ls 检查当前目录及文件位置,然后传入正确路径。如果路径中有空格,请将整个路径括在引号中。如果运行 ./script.sh 时出现“Permission denied”(权限被拒绝),请用 ls -l script.sh 检查权限;若你有权修改权限,可运行 chmod +x script.sh。同时确认你可以访问脚本所在目录。若文件系统以禁止执行的方式挂载,即使文件具有执行权限,也可能无法直接运行;只要文件可读,用 Bash 调用仍可能奏效。
如果直接执行时提示找不到文件或解释器,请检查首行的 shebang 是否有效,并确认相应解释器路径存在。如果脚本通过 bash script.sh 可以运行,但用 ./script.sh 无法运行,shebang 或执行权限是值得优先检查的地方。如果任一方式能启动脚本,但其中某条命令失败,请检查该命令的路径、输入和错误消息;修改脚本文件的执行权限无法修复脚本内部命令的错误。