使用不同的 shell 启动 xterm 并执行命令

Din*_*esh 4 zsh xterm

我默认的shell环境bash,我想开始xtermzsh和执行某些命令。

一般来说,要执行一些命令,我​​使用以下

xterm -e "ls -lrt;pwd;whoami"
Run Code Online (Sandbox Code Playgroud)

这是在bashshell 中执行命令xterm

xterm使用不同的外壳启动,我正在使用以下内容。

xterm -ls /bin/zsh
Run Code Online (Sandbox Code Playgroud)

那么,我怎样才能将这两者结合起来呢?当我尝试。我收到以下错误。

[dinesh@mypc]$ xterm -ls /bin/zsh -e "ls"
xterm:  bad command line option "/bin/zsh"
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

Kus*_*nda 10

不,-ls选项xterm不带参数,它只是指定xterm启动的外壳程序应该是登录外壳程序。

这是-ls标志的完整部分,突出显示了与您的问题相关的部分:

   -ls 该选项表示启动的shell
           xterm 窗口将是一个登录 shell(即第一个字符
           of argv[0] 将是一个破折号,向外壳表明它
           应该阅读用户的 .login 或 .profile)。

           如果 -e 是,则 -ls 标志和 loginShell 资源将被忽​​略
           也给了,因为xterm不知道怎么做shell
           执行给定的命令后启动它
           登录 shell - 用户选择的 shell 不必是 Bourne
           毕竟是壳。此外, xterm -e 应该提供一个
           为需要的其他应用程序提供一致的功能
           在窗口中启动文本模式程序,如果 loginShell 是
           不被忽略, ~/.profile 的结果可能会干扰
           那。

           如果您确实希望同时获得 -ls 和 -e 的效果,您可以
           摆脱类似的东西

               xterm -e /bin/bash -l -c "我的命令在这里"

           最后,-ls 没有被完全忽略,因为 xterm -ls -e
           确实写入 /var/run/wtmp 条目(如果配置为这样做),
           而 xterm -e 没有。


Sté*_*las 10

xterm使用存储在$SHELL(最初在登录到登录 shell 时设置的变量)中的 shell 来解析命令行。因此,如果您希望命令行被zshshell解析,只需执行以下操作:

SHELL=/bin/zsh xterm -e 'echo $ZSH_VERSION; sleep 4'
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

xterm -e zsh -c 'echo $ZSH_VERSION; sleep 4'
Run Code Online (Sandbox Code Playgroud)

当传递多个参数时,xterm不会调用 shell 来解析命令行,它会直接执行第一个参数及其参数execvp()