我希望在另一个终端窗口中运行与父脚本分开的脚本,同时保持当前窗口可用。
其背后的原因是我希望允许用户能够运行一个监视脚本,该脚本将监视目录的更改。
这是我的职责
function watchFunction ()
{
./watch.sh &
}
然而,这只继续在当前窗口的后台运行。
由于我的 Linux 发行版,我无法使用或安装以下任何内容: genone-terminal ; xterm;屏幕 ;控制台;终端或任何其他可安装的工具!
任何建议都会很棒,因为我刚刚开始使用 bash 脚本!
答案1
如果您只想观看脚本的输出,可以将脚本的输出重定向到一个文件,然后在另一个窗口中观看该文件:
# Run the script and log all output to a file
./watch.sh &> /var/log/watch.log &
# Watch the file, possibly in another terminal window
tail -f /var/log/watch.log
根据我的经验,这种行为(写入日志文件)非常典型。我不记得曾经使用过开始生成其他终端窗口的命令行应用程序。
也就是说,如果您确实想从命令行打开一个新的终端窗口,那么这将取决于终端应用程序。 AskUbuntu StackExchange 网站上有一篇关于此的好文章:
特别是参见这个答案。例如,对于 Gnome 终端,您可以使用如下命令:
gnome-terminal -x sh -c "./watch.sh; bash"
如果您想以编程方式确定正在使用哪个终端应用程序,您可能需要参考以下 AskUbuntu 帖子:
那里接受的解决方案定义了以下函数:
which_term(){
term=$(perl -lpe 's/\0/ /g' \
/proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline)
## Enable extended globbing patterns
shopt -s extglob
case $term in
## If this terminal is a python or perl program,
## then the emulator's name is likely the second
## part of it
*/python*|*/perl* )
term=$(basename "$(readlink -f $(echo "$term" | cut -d ' ' -f 2))")
version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
;;
## The special case of gnome-terminal
*gnome-terminal-server* )
term="gnome-terminal"
;;
## For other cases, just take the 1st
## field of $term
* )
term=${term/% */}
;;
esac
version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
echo "$term $version"
}
答案2
根据您的评论,您正在使用 xfce4-terminal。从其手册页,你可以看到下面的选项
−x, −−execute
Execute the remainder of the command line inside the terminal
因此,您可以简单地将其添加到./watch.sh
,即
function watchFunction ()
{
xfce4-terminal -x ./watch.sh &
}
答案3
好吧,我在我编写的脚本中实现了这一点。您需要在执行命令之前启动一个终端窗口。
xterm -e sh -c path/yo/your/script &;
在我编写的脚本中,我使用了这样的内容:
terminal="xterm"
run () {
cmd="$terminal -e sh -c $1"
[ -n "$1" ] && (eval "$cmd") > /dev/null 2>&1 &
}
run $VISUAL example/file/name
这将启动一个终端,在其上执行您的程序。它还将防止第一个终端充满来自新窗口的 stderr/stdout 消息。
只需将terminal
变量替换为您使用/喜欢的变量即可。