我有一个简单的 bash 脚本,它接受输入并使用输入打印几行
fortinetTest.sh
read -p "Enter SSC IP: $ip " ip && ip=${ip:-1.1.1.1}
printf "\n"
#check IP validation
if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "SSC IP: $ip"
printf "\n"
else
echo "Enter a valid SSC IP address. Ex. 1.1.1.1"
exit
fi
我尝试将它们上传到我的服务器,然后尝试通过curl
当我使用cURL / wget时,不确定为什么输入提示永远不会启动。
我错过了什么吗?
如何继续进行调试?
我现在对任何建议持开放态度。
任何提示/建议/帮助都将非常感谢!
答案 0 :(得分:17)
使用curl ... | bash
表单时,bash的stdin正在读取脚本,因此stdin不适用于read
命令。
尝试使用Process Substitution像本地文件一样调用远程脚本:
bash <( curl -s ... )
答案 1 :(得分:9)
您可以通过运行以下脚本轻松复制您的问题
UIButton
这是因为您使用UIButton
启动的bash未获得$ cat test.sh | bash
Enter a valid SSC IP address. Ex. 1.1.1.1
,当您执行pipe
时,会从TTY
读取该内容在这种情况下read -p
。所以问题不在于卷曲。问题不在于读取tty
所以修复是为了确保你从tty
做好准备stdin
一旦你这样做,即使test.sh
也会开始工作
read < /dev/tty -p "Enter SSC IP: $ip " ip && ip=${ip:-1.1.1.1}
printf "\n"
#check IP validation
if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "SSC IP: $ip"
printf "\n"
else
echo "Enter a valid SSC IP address. Ex. 1.1.1.1"
exit
fi
答案 2 :(得分:0)
我个人更喜欢source <(curl -s localhost/test.sh)
选项。虽然它类似于bash ...
,但一个显着的区别是过程如何处理。
bash
将导致新进程被启动,该进程将从脚本中唤起命令。
另一方面,source
将使用当前进程来唤起脚本中的命令。
在某些情况下可以发挥关键作用。我承认这不是经常发生的事。
要演示如下操作:
### Open Two Terminals
# In the first terminal run:
echo "sleep 5" > ./myTest.sh
bash ./myTest.sh
# Switch to the second terminal and run:
ps -efjh
## Repeat the same with _source_ command
# In the first terminal run:
source ./myTest.sh
# Switch to the second terminal and run:
ps -efjh
结果应与此类似:
执行前:
运行bash
(主要+两个子流程):
运行source
(主要+一个子流程):
<强>更新强>
bash
和source
使用变量使用情况的差异:
source
命令将使用您当前的环境。这意味着在执行时,脚本生成的所有更改和变量声明都将在您的提示中可用。
bash
将作为一个不同的过程运行;因此,当进程退出时,所有变量都将被丢弃。
我想每个人都会同意每种方法都有好处和缺点。您只需决定哪一个更适合您的用例。
## Test for variables declared by the script:
echo "test_var3='Some Other Value'" > ./myTest3.sh
bash ./myTest3.sh
echo $test_var3
source ./myTest3.sh
echo $test_var3
## Test for usability of current environment variables:
test_var="Some Value" # Setting a variable
echo "echo $test_var" > myTest2.sh # Creating a test script
chmod +x ./myTest2.sh # Adding execute permission
## Executing:
. myTest2.sh
bash ./myTest2.sh
source ./myTest2.sh
./myTest2.sh
## All of the above results should print the variable.
我希望这会有所帮助。