调用脚本时,“读取”后出现语法错误我用它们来自动化一个小的过程。
script1使用命令启动script2
ssh -i /pathToKeyFile/keyfile.pem user@server2 'bash -s < /pathToScriptFile/script2.sh'
在script2.sh中,我有一个“大小写”问题:
#!/bin/bash
# Ask to start up JBOSS
read -p "DB restore completed. Start JBOSS and FACADE (y/n)" startJBOSS
case "$startJBOSS" in
y|Y ) echo "Starting JBOSS and FACADE";;
n|N ) echo "Stopping here"
exit;;
* ) echo "Invalid option..."
exit;;
esac
echo "More commands here"
exit
因此,当我执行script1.sh时,它在远程服务器上可以正常运行,而starstt2可以正常运行。 但是script2无法出错
bash: line 5: syntax error near unexpected token `)'
bash: line 5: ` y|Y ) echo "Starting JBOSS and FACADE";;'
如果我直接从远程服务器执行script2.sh,它将按预期工作。
我也尝试过将两个脚本文件都放在一台服务器中。在这种情况下,启动script2.sh的命令是不同的,但是在这种情况下,两者都可以按预期工作。
我无法弄清为什么script2.sh从其他服务器中启动以及从其他服务器启动时失败。我认为script2.sh“代码”是正确的,因为它在单独运行时可以正常工作。
答案 0 :(得分:3)
问题是read
从stdin读取-代码来自同一位置。
因此,它从源文件中读取一行,而不是从用户那里读取一行,而使用case
命令,从而使源文件的其余部分在语法上无效。
bash -s <filename
来自<filename
副本无法访问的某个地方(例如SSH连接的另一端,或只能读取的文件)时, bash
才有意义由其他用户),但您的示例并非如此。因此,您可以停止使用-s
参数和重定向:
ssh -i /pathToKeyFile/keyfile.pem user@server2 'bash /pathToScriptFile/script2.sh'
另一种方法是使read
以实际有用户在TTY上收听为条件:
if [[ -t 0 ]]; then # test whether FD 0, stdin, is a TTY
read -p "DB restore completed. Start JBOSS and FACADE (y/n)" startJBOSS
else
startJBOSS=y # no TTY, so assume yes
fi
/dev/tty
中读取,并确保SSH将其通过。另一种方法是显式读取/dev/tty
,然后通过将适当的参数传递给ssh
来使其在脚本的上下文中有效:
if read -p "DB restore completed. Start JBOSS and FACADE (y/n)" startJBOSS </dev/tty; then
: "read $startJBOSS from user successfully" # <- will be logged if run with set -x
else
echo "Unable to read result from user; is this being run with a TTY?" >&2
exit 1
fi
...然后,另一方面,对SSH使用-t
参数,以强制存在一个TTY(如果SSH本身可用,则为TTY;否则,为 it 也无法从带外用户那里读取信息):
ssh -t -i /pathToKeyFile/keyfile.pem user@server2 'bash -s < /pathToScriptFile/script2.sh'