kem*_*102 87 shell bash ubuntu shell-script
我一直在编写一个脚本,该脚本可以自动为 Raspberry Pi 开发设置开发环境(工作的分步详细信息在这里)。该脚本链接在该文章中,但您也可以在这里找到它。现在,当运行此脚本安装并设置环境时没有错误,但由于默认情况下 sudo 的超时值,您必须多次输入 sudo 密码。所以我开始尝试删除所有 sudo 行并通过 sudo 在命令行运行整个脚本,如下所示:
kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh
Run Code Online (Sandbox Code Playgroud)
这按预期工作正常,直到这一点为止:
./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)
现在,当不使用 sudo 运行整个脚本时,此行以前可以正常工作。据我所知,这条线作为 sudo 运行并没有任何内容可以阻止它工作,有人有任何想法吗?
Gil*_*il' 114
该脚本不以shebang行开头,因此系统使用/bin/sh. 在 Ubuntu 上,/bin/sh是dash,这是一个专为快速启动和执行而设计的外壳,只有标准功能。当 dash 到达第 68 行时,它会看到一个语法错误:该括号在上下文中对其没有任何意义。
由于 dash (像所有其他 shell 一样)是一个解释器,它不会抱怨直到执行到达有问题的行。因此,即使脚本在测试中的某个时刻成功启动,一旦到达第 68 行,它也会中止。
shebang 行必须是文件中的第一行。由于您使用 bash 功能,文件的第一行必须是#!/bin/bashor #!/usr/bin/env bash。
如果shebang不在第一行,不管root用户的shell,SHELL变量还是-sflag都不会被尊重。您可以通过一个简单的示例轻松确认这一点:
#
#!/bin/bash
offset=(`ls`)
echo $offset
Run Code Online (Sandbox Code Playgroud)
使用 sudo 运行此脚本将在最新版本的 Ubuntu 和 Debian 中引发语法错误。
您有两个选项可以确保脚本被解释bash:
将shebang移到第一行
sudo像这样运行:
sudo bash ./pi_dev_env_install.sh
Run Code Online (Sandbox Code Playgroud)