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

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

我的默认 shell 环境是bash,我想启动xtermzsh执行一些命令。

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

xterm -e "ls -lrt;pwd;whoami"

bash这是在shell中执行命令xterm

要使用不同的 shell 启动xterm,我使用以下命令。

xterm -ls /bin/zsh

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

[dinesh@mypc]$ xterm -ls /bin/zsh -e "ls"
xterm:  bad command line option "/bin/zsh"

如何解决这个问题?

答案1

不,-ls选项xterm不带参数,它只是指定启动的 shellxterm应该是登录 shell。

以下是该标志的完整部分-ls,其中突出显示了与您的问题相关的部分:

   -ls 该选项表示启动的shell
           xterm 窗口将是一个登录 shell(即第一个字符
           argv[0] 是一个破折号,向 shell 表明它
           应读取用户的 .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 则不然。

答案2

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

SHELL=/bin/zsh xterm -e 'echo $ZSH_VERSION; sleep 4'

或者你可以这样做:

xterm -e zsh -c 'echo $ZSH_VERSION; sleep 4'

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

答案3

除了@Stéphane 的答案之外,您还可以在$HOME/.profilewith中设置 SHELL 环境变量export SHELL=/bin/zsh,前提是您是系统上唯一想要使用 zsh 的人。

相关内容