V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zeroday
V2EX  ›  问与答

可以一个系统 iterm 一个 shell 比如 zsh,terminal 另一个 shell 比如 fish 吗?

  •  
  •   zeroday · 2014-04-11 14:21:28 +08:00 · 6322 次点击
    这是一个创建于 3879 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2014-04-11 18:45:18 +08:00
    感谢各位的回复,总结一下解决方法。
    @spritevan 的方法:
    terminal
    ---

    preferences -> startup
    shells open with: command -> path_of_fish


    iterm2
    ---

    preferences -> profiles -> general
    command -> path_of_zsh

    @nicai000 的方法:
    zsh回车 or bash回车
    第 2 条附言  ·  2014-04-11 22:16:21 +08:00
    强烈推荐@little_cup 非常极客的方法:

    在.bash_profile末尾添加:

    if [ "$1" == "" ] && [[ -z $(ps aux |grep wireshark |grep -v grep) ]]; then
    /usr/local/bin/fish
    echo Goodby!
    exit 0
    fi
    19 条回复    1970-01-01 08:00:00 +08:00
    bingwenshi
        1
    bingwenshi  
       2014-04-11 14:45:03 +08:00
    不太了解你的场景是什么, 这个配置只能绑定在用户配置里, 只能一个吧(没看过具体源码), 不如开两个用户 ?
    yukirock
        2
    yukirock  
       2014-04-11 14:46:04 +08:00
    zsh 下執行 fish 可以臨時切換過去,<c-d> 退出即返回。
    長期切換的話,$SHELL 應該不能匹配兩個不同的 sh 吧?
    flyee
        3
    flyee  
       2014-04-11 14:58:57 +08:00
    猜测可以通过检查$TERM_PROGRAM实现。未测试。
    zeroday
        4
    zeroday  
    OP
       2014-04-11 16:47:49 +08:00
    @bingwenshi 场景是这样的:平时只做rails相关的东西,最多就是brew git等,用bash的东西比较少,所以shell是fish shell,而且也觉得fish shell自动完成提示比 zsh 好看, function 和 if 写起来就和 lua 差不多,使用他日常使用更得心应手。但fish非标准shell,和sh不兼容,vim有点问题,也不打算支持heredoc。所以就想,能否一个终端一个shell,方便切换。
    zeroday
        5
    zeroday  
    OP
       2014-04-11 16:48:51 +08:00
    @yukirock 我是fish作为日常使用的,能否fish下直接临时切换到zsh或bash?
    nicai000
        6
    nicai000  
       2014-04-11 17:01:27 +08:00   ❤️ 1
    @zeroday zsh回车 or bash回车
    lululau
        7
    lululau  
       2014-04-11 17:05:03 +08:00
    iTerm2 可以每个 Profile 指定不同的 shell
    yukirock
        8
    yukirock  
       2014-04-11 17:13:08 +08:00
    @zeroday chsh 命令可以更改默認 shell。
    little_cup
        9
    little_cup  
       2014-04-11 17:21:18 +08:00   ❤️ 1
    @zeroday 握手,几乎一样的习惯,我的解决方案是这样的,系统默认shell设置为bash,然后在.bash_profile末尾添加:

    if [ "$1" == "" ] && [[ -z $(ps aux |grep wireshark |grep -v grep) ]]; then
    /usr/local/bin/fish
    echo Goodby!
    exit 0

    这样在MacVim就可以正常使用。缺点是x11的程序(幸好我只用得到wireshark)启动会有点问题,必须单独如上指定。
    zeroday
        10
    zeroday  
    OP
       2014-04-11 18:26:01 +08:00
    @yukirock `chsh -s /usr/local/bin/zsh` or `chsh -s /bin/bash`,然后就要输入密码,因为我的密码比较复杂,感觉这样来回切换实在有点繁琐。
    spritevan
        11
    spritevan  
       2014-04-11 18:36:51 +08:00   ❤️ 1
    terminal
    ---

    preferences -> startup
    shells open with: command -> path_of_fish


    iterm2
    ---

    preferences -> profiles -> general
    command -> path_of_zsh
    zeroday
        12
    zeroday  
    OP
       2014-04-11 18:38:00 +08:00
    @little_cup 握手,同道中人,不过我没明白默认shell设置成bash,那不就是bash了吗?fish不是没有使用了?
    zeroday
        13
    zeroday  
    OP
       2014-04-11 18:40:56 +08:00
    @spritevan 太棒了,这真是个好方法,非常感谢。
    zeroday
        14
    zeroday  
    OP
       2014-04-11 18:42:44 +08:00
    @nicai000 谢谢你了,同样是个办法。
    little_cup
        15
    little_cup  
       2014-04-11 21:45:38 +08:00
    @zeroday
    把那段添加后,终端会在窗口输入的状态自动切换成fish,而在执行shell脚本时保持bash。
    以前我也是 @spritevan 那样设置的,可是会在远程ssh登回来的时候露马脚,而且applescript执行tell application "Terminal" xxxx也无法正确传递。
    zeroday
        16
    zeroday  
    OP
       2014-04-11 21:57:53 +08:00
    @little_cup 听起来真是一个巧妙的设置,可是在我的系统里不生效,提示“-bash: /Users/MasterMac/.bash_profile: line 24: syntax error: unexpected end of file“
    这是我的.bash_profile
    ########################This is my .bash_profile#############################


    #for color
    export CLICOLOR=1

    export PS1='\n\[\e[0;30m\]┌─\[\e[0m\]\[\e[01;30m\]\u@\h\[\e[00m\]:\[\e[01;34m\]\w\[\e[00m\]\n\[\e[0;30m\]└───\[\e[0m\]\$ \[\e[00;33m\]$(__git_ps1 "(%s)")\[\e[00m\] '


    printf "\n"

    SaySomething=$(fortune -a -s | sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
    cowsay $SaySomething | lolcat -f

    printf "\n"

    # Load RVM into a shell session *as a function*
    [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

    if [ "$1" == "" ] && [[ -z $(ps aux |grep wireshark |grep -v grep) ]]; then
    /usr/local/bin/fish
    echo Goodby!
    exit 0
    little_cup
        17
    little_cup  
       2014-04-11 22:03:18 +08:00   ❤️ 1
    @zeroday …………sorry我复制过来掉了最后一行,在exit 0那行之后添加一行fi即可。
    zeroday
        18
    zeroday  
    OP
       2014-04-11 22:15:00 +08:00
    @little_cup 赞啊,fish和sh竟然兼容了,MacVim也OK了。
    little_cup
        19
    little_cup  
       2014-04-11 22:23:54 +08:00   ❤️ 1
    @zeroday 不客气~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 09:18 · PVG 17:18 · LAX 01:18 · JFK 04:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.