如何在 bash 中以编程方式执行回车?



我的主文件是 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.

相关内容

  • 没有找到相关文章

最新更新