为什么这个命令不会在&?之后返回shell

时间:2016-07-26 18:29:12

标签: bash shell ubuntu-14.04

在Ubuntu 14.04中,我创建了以下bash脚本:

flock -nx "$1" xdg-open "$1" &

想法是锁定$ 1(flock)中指定的文件,然后在我的常用编辑器(xdg-open)中打开它,最后返回提示符,这样我就可以按顺序打开其他文件(&)。 / p>

然而,&没有像预期的那样工作。我需要按Enter键再次出现shell提示符。在更简单的结构中,例如

gedit test.txt &

它可以正常工作,立即返回提示。我认为这与第一行中存在两个命令有关。我做错了什么,拜托?

修改

提示实际上存在,但它以某种方式"隐藏"。如果我发出命令

sudo ./edit error.php

回复

Warning: unknown mime-type for "error.php" -- using "application/octet-stream"
Error: no "view" mailcap rules found for type "application/octet-stream"
Opening "error.php" with Geany  (application/x-php)
__

上述错误与问题无关。但不是__而是__什么也没看到。我知道提示符存在,因为我可以发出其他命令,例如ls,并且它们可以工作。但问题仍然存在:为什么隐藏提示?我怎样才能让它正常显示?

2 个答案:

答案 0 :(得分:4)

  

为什么这个命令在&?之后没有返回shell?

是。

您在后台运行命令。一旦命令启动,shell就会打印一个新的提示,而不是等待它完成。

根据您的最新评论,后台命令正在向您的屏幕打印一些消息。一个简单的例子:

$ echo hello &
$ hello

光标留在$ hello

之后的行的开头

就shell而言,它打印了一个提示并正在等待一个新命令。它并不知道或不关心后台进程搞砸了你的显示器。

一种解决方案是将命令的输出重定向到屏幕以外的某个位置,或者文件或/dev/null。如果这是一条错误消息,您可能需要重定向stdout和`stderr。

flock -nx "$1" xdg-open "$1" >/dev/null 2>&1 &

(这假设您不关心消息的内容。)

alvits在评论中指出的另一个选择是在执行命令后休眠一秒左右,因此下一个shell提示符后面会出现 消息。 sleep命令在前台执行,延迟打印下一个提示。一个简单的例子:

$ echo hello & sleep 1
hello
[1] + Done                       echo hello
$ 

或您的例子:

flock -nx "$1" xdg-open "$1" & sleep 1

这假定在第一秒打印错误消息。对你而言,这可能是一个有效的假设,但它可能不是一般的。

答案 1 :(得分:0)

我不认为命令正在按照你的想法行事。 您是否尝试过两次运行它以查看第二次无法获取锁定。 好吧,如果你这样做,你会发现它并没有失败,因为xdg-open要求执行编辑器。此外,如果它失败了,你期待一些迹象。

你应该使用这样的东西

flock -nx "$1" -c "gedit '$1' &" || { echo "ERROR"; exit 1; }