Bash脚本,命令结束后更新输出

Bash脚本,命令结束后更新输出,bash,shell,Bash,Shell,我尝试过不同的方法,但迄今为止没有一种有效 echo "Starting" checklocation(){ if (command blabla) then locationOne=$"Found" else locationOne=$"Not found" fi } checklocation & echo "Let's check: " $locationOne echo "Ending" 由于我的命令需要很长时间才能提供结果,所以我希望在结果准备好后继续打印所有输

我尝试过不同的方法,但迄今为止没有一种有效

echo "Starting"

checklocation(){
if (command blabla)

then locationOne=$"Found"

else locationOne=$"Not found"

fi

}
checklocation &

echo "Let's check: " $locationOne

echo "Ending"
由于我的命令需要很长时间才能提供结果,所以我希望在结果准备好后继续打印所有输出并显示$locationOne的值。下面的代码可以一次精细打印所有输出,但是$locationOne不会出现。我尝试使用printf,但\r也没有成功。有什么建议吗

为了澄清,我想在命令完成后加载箭头指向的变量值

echo "Starting"

checklocation(){
if (command blabla)
then
locationOne="Found"
else 
locationOne="Not found"
fi
}
echo "Calling function"
checklocation
echo "Let's check: " $locationOne
echo "Ending"

尝试按照上面的更正进行操作

分配locationOne变量时,删除“$

另外,在调用函数remove“&”时,请忽略此选项,因为它被视为一个参数


祝你好运

您可以使用
wait
等待子进程状态更改。(检查人员等待)


您希望稍后返回并修改屏幕输出

在一般情况下,这是非常困难的,但是您可以通过确保您编写的输出不会在屏幕上滚动,从而很难预测必须在何处进行修改,从而大大简化它

本例通过首先清除屏幕来实现,这样任何额外的输出都不太可能滚动。然后可以通过坐标进行更新:

#!/bin/bash

check() {
  sleep 3
  tput sc        # Save cursor
  tput cup 1 14  # Set y,x coordinates
  printf '%s' "Found"
  tput rc        # Restore cursor
}
check &
clear # Clear screen so we know where we are
echo "Starting"
echo "Let's check: "
echo "Ending"
wait
这表明:

Starting
Let's check:  
Ending
持续三秒钟,然后将其更新为:

Starting
Let's check:  Found
Ending
备选办法包括:

  • 将屏幕上需要的数据保持为字符串,并在需要更新整个屏幕时清除+写入
  • 跟踪您写入的行数,然后使用“光标向上”ANSI命令(
    tput cuu
    )向上移动到您认为要修改的行所在的位置

  • echo“让我们检查一下:“$locationOne
    可能在
    命令blabla
    在后台完成之前发生。
    $locationOne一旦结果准备就绪
    -将其输出到文件中。然后打印文件内容。@PaulHodges我也尝试在最后一个echo之后添加sleep命令,但$locationOne没有displayed@KamilCuk你知道没有文件的情况下有什么办法吗?首先,你需要从函数中返回一个值。其次,你需要在你的主程序中捕捉到这一点。第三,您需要使用
    echo-n
    将光标保留在行的末尾,等待函数的输出…我添加了&以允许脚本继续执行,而不必等待checklocation@Porcac1x是的,但正如你的问题所说的…你想在它准备好后展示它。。。所以你得等一等。另外,
    locationOne
    是函数的本地项。@MarkSetchell嘿,Mark,当结果准备好时,我只想显示locationOne,但在结果准备好之前,所有内容(包括让我们检查)都将颠倒顺序:(我恐怕无法更改输出的顺序,而且脚本需要在Mac OS X上运行,并带有标准的软件配置。哦,我现在明白你的意思了。你希望程序不等待就继续运行,然后在输出准备好后,返回到上一个控制台输出的位置,并在屏幕上修改它。这非常重要。)der.这正是我的意思@另一个家伙!下面的脚本做了我想要的,但是它在打印最后一个echo之前停止了一切:#!/bin/bash sek=5 echo“$sek Seconds Wait!”而[$sek-ge 1]do echo-ne”请稍等一下$sek…\r“sleep 1 sek=$[$sek-1]done echo echo”ready!”好的,我添加了一个示例。您的示例运行得非常好,谢谢!一切正常。但是,当我尝试在同一脚本的三个不同部分应用相同的代码时,输出变得混乱,因为光标没有跟随我给出的位置。
    Starting
    Let's check:  
    Ending
    
    Starting
    Let's check:  Found
    Ending