How do I use Bash on Windows from the Visual Studio Code integrated terminal?

前端 未结 17 1843
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-28 00:28

Visual Studio Code on Windows uses PowerShell by default as the integrated terminal. If you want to use Bash from Visual Studio Code, what steps should be followed?

17条回答
  •  抹茶落季
    2020-11-28 00:46

    What about detached or unrelated shells and code [args] support?

    While other answers talk about how to configure and use the VScode integrated WSL bash terminal support, they don't solve the problem of "detached shells": shells which were not launched from within VScode, or which somehow get "disconnected" from the VScode server instance associated with the IDE.

    Such shells can give errors like:

    Command is only available in WSL or inside a Visual Studio Code terminal.

    or...

    Unable to connect to VS Code server. Error in request

    Here's a script which makes it easy to solve this problem.

    I use this daily to connect shells in a tmux session with a specific VScode server instance, or to fix an integrated shell that's become detached from its hosting IDE.

    #!/bin/bash
    # codesrv-connect
    #
    #  Purpose:
    #     Copies the vscode connection environment from one shell to another, so that you can use the
    #     vscode integrated terminal's "code [args]" command to communicate with that instance of vscode
    #     from an unrelated shell.
    #
    #  Usage:
    #    1.  Open an integrated terminal in vscode, and run codesrv-connect
    #    2.  In the target shell, cd to the same directory and run
    #       ". .codesrv-connect", or follow the instruction printed by codesrv-connect.
    #
    #  Setup:
    #    Put "codesrv-connect somewhere on your PATH (e.g. ~/bin)"
    #
    #  Cleanup:
    #    - Delete abandoned .codesrv-connect files when their vscode sessions die.
    #    - Do not add .codesrv-connect files to git repositories.
    #
    #  Notes:
    #     The VSCODE_IPC_HOOK_CLI environment variable points to a socket which is rather volatile, while the long path for the 'code' alias is more stable: vscode doesn't change the latter even across a "code -r ." reload.  But the former is easily detached and so you need a fresh value if that happens.  This is what codesrv-connect does: it captures the value of these two and writes them to .codesrv-connect in the current dir.
    #
    #   Verinfo: v1.0.0 - les.matheson@gmail.com - 2020-03-31
    #
    
    function errExit {
        echo "ERROR: $@" >&2
        exit 1
    }
    
    [[ -S $VSCODE_IPC_HOOK_CLI ]] || errExit "VSCODE_IPC_HOOK_CLI not defined or not a pipe [$VSCODE_IPC_HOOK_CLI]"
    if [[ $(which code) != *vscode-server* ]]; then
        errExit "The 'code' command doesn't refer to something under .vscode-server: $(type -a code)"
    fi
    cat <.codesrv-connect
    # Temp file created by $(which codesrv-connect): source this into your working shell like '. .codesrv-connect'
    # ( git hint: add ".codesrv-connect" to .gitignore )
    #
    cd "$PWD"
    if ! test -S "$VSCODE_IPC_HOOK_CLI"; then
        echo "ERROR: $VSCODE_IPC_HOOK_CLI not a socket. Dead session."
    else
        export VSCODE_IPC_HOOK_CLI="$VSCODE_IPC_HOOK_CLI"
        alias code=$(which code)
        echo "Done: the 'code' command will talk to socket \"$VSCODE_IPC_HOOK_CLI\" now."
        echo "You can delete .codesrv-connect when the vscode server context dies, or reuse it in other shells until then."
    fi
    EOF
    
    echo "# OK: run this to connect to vscode server in a destination shell:"
    echo ". $PWD/.codesrv-connect"
    
    

提交回复
热议问题