在新的终端窗口中运行脚本

在新的终端窗口中运行脚本

我希望在另一个终端窗口中运行与父脚本分开的脚本,同时保持当前窗口可用。

其背后的原因是我希望允许用户能够运行一个监视脚本,该脚本将监视目录的更改。

这是我的职责

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变量替换为您使用/喜欢的变量即可。

相关内容