Bash 仅当当前端子线不为空时,才向端子回显新线

Bash 仅当当前端子线不为空时,才向端子回显新线,bash,terminal,Bash,Terminal,在bash中,我希望根据终端中的当前行是否为空,有条件地回显新行 例如,first.sh首先运行,但我无法控制它,也不知道每次打印的内容。我可以让second.sh始终在一个全新的行上开始打印,并且不在上面留下任何空白行吗 first.sh #!/bin/bash let "n = 1" max=$((RANDOM%3)) while [ "$n" -le "$max" ] do printf "%s" x let "n += 1" done #!/bin/bash #if [ n

在bash中,我希望根据终端中的当前行是否为空,有条件地回显新行

例如,first.sh首先运行,但我无法控制它,也不知道每次打印的内容。我可以让second.sh始终在一个全新的行上开始打印,并且不在上面留下任何空白行吗

first.sh

#!/bin/bash

let "n = 1"
max=$((RANDOM%3))
while [ "$n" -le "$max" ]
do
  printf "%s" x
  let "n += 1"
done
#!/bin/bash

#if [ not_in_first_terminal_column ]
#  echo
#fi
echo "Hola"
second.sh

#!/bin/bash

let "n = 1"
max=$((RANDOM%3))
while [ "$n" -le "$max" ]
do
  printf "%s" x
  let "n += 1"
done
#!/bin/bash

#if [ not_in_first_terminal_column ]
#  echo
#fi
echo "Hola"
我想要以下输出之一

$ ./first.sh && ./second.sh
Hola
$ ./first.sh && ./second.sh
x
Hola
$ ./first.sh && ./second.sh
xx
Hola
但不是

$ ./first.sh && ./second.sh

Hola
$ ./first.sh && ./second.sh
xHola
$ ./first.sh && ./second.sh
xxHola

有可能做我想做的吗?我想使用ANSI转义码,类似于in,但我还没有找到方法。

如果变量的值不是空的,请使用-n:

[[ -n $VAR ]] && echo "$VAR"

# POSIX or Original sh compatible:

[ -n "$VAR" ] && echo "$VAR"

# With if:

if [[ -n $VAR ]]; then
   echo "$VAR"
fi

if [ -n "$VAR" ]; then
   echo "$VAR"
fi
它实际上相当于
[[$VAR!=“”]
![“$VAR”=”]

此外,在Bash中,如果它只填充了空格,则可以对其进行测试:

shopt -s extglob  ## Place this somewhere at the start of the script

[[ $VAR == +([[:space:]]) ]] && echo "$VAR"

if [[ $VAR == +([[:space:]]) ]]; then
     echo "$VAR"
fi
使用
[[:blank:][]
仅匹配空格和制表符,而不匹配换行符等更有用的内容

如果要从输入文件或管道中删除空行,可以使用其他工具,如sed:


sed-ne'/^$/!p'文件
。|sed-ne'/^[:space:]*$/!p

非常感谢你的回答,但我不是问这个问题。我的问题不是很清楚,所以我用一个具体的例子重新写了一遍。再次感谢!不在这种情况下,终端仅在从两个异步调度的进程接收字符时输出字符。您需要将两个后台进程写入第三个进程,该进程负责以您想要的方式合并两个输出流,然后它写入标准输出。background.sh进程不在我的控制之下,它可以是输出到终端的任何进程。但是我的脚本不能询问终端状态吗?就像您可以删除当前行一样,例如,使用ansi转义序列(我想您也可以请求当前列……如果可以的话,这对您没有帮助。这是一个典型的竞争条件:在终端接收到下一个输出之前,状态可能会改变。