我的默认 shell 环境是bash
,我想启动xterm
并zsh
执行一些命令。
一般来说,要执行一些命令,我使用以下命令
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/.profile
with中设置 SHELL 环境变量export SHELL=/bin/zsh
,前提是您是系统上唯一想要使用 zsh 的人。