我的主文件是 main.sh:
cd a_folder
echo "executing another script"
source anotherscript.sh
cd ..
#some other operations.
anotherscript.sh:
pause(){
read -p "$*"
}
echo "enter a number: "
read number
#some operation
pause "Press enter to continue..."
我想跳过暂停命令。但是当我这样做时:
echo "/n" | source anotherscript.sh
它不允许输入数字。我希望出现"/n",以便允许用户输入数字但跳过暂停语句。
PS:无法对 anotherscript.sh 进行任何更改。所有更改都将在 main.sh 中完成。
尝试
echo | source anotherscript.sh
您的方法不起作用,因为要获取的脚本需要来自 stdin的两行:首先是包含数字的行,然后是空行(正在暂停(。因此,您必须将两行(数字和空行(馈送到脚本中。如果您仍然想从自己的 stdin(标准(中获取数字,则必须在以下之前使用read
命令:
echo "executing another script"
echo "enter a number: "
read number
printf "$numbernn" | source anotherscript.sh
但这仍然潜伏着一些危险:source 命令是在子 shell 中执行的;因此,anotherscript.sh
执行的任何环境更改都不会在 shell 中可见。
解决方法是将数字读取逻辑置于 main.sh 之外:
# This is script supermain.sh
echo "executing another script"
echo "enter a number: "
read number
printf "$numbernn"|bash main.sh
在 main.sh,您只需保持source anotherscript.sh
,没有任何管道。
正如 user1934428 评论的那样,bash
管道会导致级联 要在子壳中执行的命令和变量修改 没有反映在当前的进程中。
若要更改此行为,可以使用内置shopt
设置lastpipe
。 然后bash
更改作业控件,以便 管道在当前 shell 中执行(就像tsch
一样(。
那你能试试:
main_sh
#!/bin/bash
shopt -s lastpipe # this changes the job control
read -p "enter a number: " x # ask for the number in main_sh instead
cd a_folder
echo "executing another script"
echo "$x" | source anotherscript.sh > /dev/null
# anotherscript.sh is executed in the current process
# unnecessary messages are redirected to /dev/null
cd ..
echo "you entered $number" # check the result
#some other operations.
这将正确打印number
的值。
或者,您也可以说:
#!/bin/bash
read -p "enter a number: " x
cd a_folder
echo "executing another script"
source anotherscript.sh <<< "$x" > /dev/null
cd ..
echo "you entered $number"
#some other operations.