在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
,并且它们可以工作。但问题仍然存在:为什么隐藏提示?我怎样才能让它正常显示?
答案 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; }