メインコンテンツまでスキップ

터미널 셸 통합

Visual Studio Code는 일반적인 셸과 통합할 수 있는 기능을 가지고 있어 셸 내부에서 실제로 무슨 일이 일어나고 있는지 더 잘 이해할 수 있습니다. 이 추가 정보는 작업 디렉토리 감지 및 명령 감지, 데코레이션, 탐색과 같은 유용한 기능을 가능하게 합니다.

지원되는 셸:

  • Linux/macOS: bash, fish, pwsh, zsh
  • Windows: pwsh

설치

자동 스크립트 삽입

기본적으로, 셸 통합 스크립트는 VS Code에서 실행된 지원되는 셸에서 자동으로 활성화되어야 합니다. 이는 셸 세션이 시작될 때 인수 및/또는 환경 변수를 주입하여 수행됩니다. 이 자동 주입은 terminal.integrated.shellIntegration.enabledfalse로 설정하여 비활성화할 수 있습니다.

이 표준적이고 쉬운 방법은 하위 셸, 일반 ssh 세션( Remote - SSH 확장을 사용하지 않는 경우) 또는 일부 복잡한 셸 설정과 같은 고급 사용 사례에서는 작동하지 않을 수 있습니다. 이러한 경우 셸 통합을 활성화하는 권장 방법은 수동 설치입니다.

注記

자동 주입은 셸의 오래된 버전에서는 작동하지 않을 수 있습니다. 예를 들어, 오래된 버전의 fish는 주입이 작동하는 방식인 $XDG_DATA_DIRS 환경 변수를 지원하지 않습니다. 수동 설치를 통해 작동시킬 수 있습니다.

수동 설치

셸 통합을 수동으로 설치하려면 VS Code 셸 통합 스크립트가 셸 초기화 중에 실행되어야 합니다. 이를 수행하는 방법은 사용하는 셸과 OS에 따라 다릅니다. 수동 설치를 사용하는 경우 terminal.integrated.shellIntegration.enabledfalse로 설정하는 것이 권장되지만 필수는 아닙니다.

ヒント

Insiders 빌드를 사용하는 경우 아래의 codecode-insiders로 대체하십시오.

bash

다음 내용을 ~/.bashrc 파일에 추가하십시오. bash에서 code ~/.bashrc를 실행하여 VS Code에서 파일을 엽니다.

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"

fish

다음 내용을 config.fish에 추가하십시오. fish에서 code $__fish_config_dir/config.fish를 실행하여 VS Code에서 파일을 엽니다.

string match -q "$TERM_PROGRAM" "vscode"
and . (code --locate-shell-integration-path fish)

pwsh

다음 내용을 PowerShell 프로필에 추가하십시오. pwsh에서 code $Profile을 실행하여 VS Code에서 파일을 엽니다.

if ($env:TERM_PROGRAM -eq "vscode") { . "$(code --locate-shell-integration-path pwsh)" }

zsh

다음 내용을 ~/.zshrc 파일에 추가하십시오. bash에서 code ~/.zshrc를 실행하여 VS Code에서 파일을 엽니다.

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"

Git Bash

다음 내용을 ~/.bashrc 파일에 추가하십시오. Git Bash에서 code ~/.bashrc를 실행하여 VS Code에서 파일을 엽니다.

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"

이식성 대 성능

위의 셸 통합 설치는 code$PATH에 있는 경우 모든 설치 유형과 호환되는 크로스 플랫폼입니다. 그러나 이 권장 접근 방식은 스크립트 경로를 가져오기 위해 Node.js를 시작하므로 셸 시작 시 약간의 지연이 발생합니다. 이 지연을 줄이기 위해 스크립트를 미리 해결하고 초기화 스크립트에 직접 추가하여 인라인하십시오.

# 먼저 실행 파일의 경로를 출력합니다:
code --locate-shell-integration-path bash

# 위의 결과를 소스 명령문에 추가합니다:
[[ "$TERM_PROGRAM" == "vscode" ]] && . "/path/to/shell/integration/script.sh"

명령 데코레이션 및 개요 눈금자

셸 통합이 가능하게 하는 것 중 하나는 터미널 내에서 실행된 명령의 종료 코드를 가져오는 기능입니다. 이 정보를 사용하여 명령이 성공했는지 실패했는지를 나타내는 데코레이션이 줄의 왼쪽에 추가됩니다. 이러한 데코레이션은 편집기에서와 마찬가지로 스크롤 막대의 비교적 새로운 개요 눈금자에도 나타납니다.

성공한 명령 옆에는 파란색 원이 나타나고, 실패한 명령 옆에는 빨간색 원과 십자가가 나타납니다. 원의 색상은 스크롤 막대에 나타납니다

데코레이션은 명령을 다시 실행하는 등의 컨텍스트 작업을 제공하기 위해 상호 작용할 수 있습니다:

성공한 명령 데코레이션을 클릭하면 컨텍스트 메뉴가 나타나며 항목: 출력 복사, HTML로 출력 복사, 명령 다시 실행 및 이 작동 방식은?

명령 및 개요 눈금자 데코레이션은 terminal.integrated.shellIntegration.decorationsEnabled 설정으로 구성할 수 있습니다.

명령 탐색

셸 통합에 의해 감지된 명령은 명령 탐색 기능(Ctrl/Cmd+Up, Ctrl/Cmd+Down)에 피드되어 더 신뢰할 수 있는 명령 위치를 제공합니다. 이 기능을 사용하면 명령 간 빠른 탐색과 출력 선택이 가능합니다. 현재 위치에서 명령까지 선택하려면 Shift를 누른 상태에서 Shift+Ctrl/Cmd+UpShift+Ctrl/Cmd+Down을 누를 수 있습니다.

명령 가이드

명령 가이드는 명령과 그 출력을 마우스로 가리킬 때 나타나는 막대입니다. 이는 명령을 더 빨리 식별하는 데 도움이 되며 셸 통합이 제대로 작동하는지 확인하는 방법이기도 합니다.

터미널의 스크린샷으로, 명령의 경계를 나타내는 명령 가이드 수직 막대를 강조 표시합니다.

명령 가이드의 색상은 색상 테마를 사용하여 사용자 정의할 수 있습니다. 명령 가이드를 토글하려면 terminal.integrated.shellIntegration.showCommandGuide 설정을 구성하십시오.

고정 스크롤

고정 스크롤 기능은 터미널 상단에 부분적으로 표시되는 명령을 "고정"하여 해당 출력이 어떤 명령에 속하는지 훨씬 쉽게 볼 수 있게 합니다. 고정 스크롤 구성 요소를 클릭하면 터미널 버퍼에서 명령의 위치로 스크롤됩니다.

고정 스크롤은 터미널 뷰포트 상단에 명령을 표시합니다

이는 terminal.integrated.stickyScroll.enabled 설정으로 활성화할 수 있습니다.

빠른 수정

VS Code는 명령의 출력을 스캔하고 사용자가 다음에 수행할 가능성이 높은 작업을 제안하는 빠른 수정 기능을 제공합니다.

 'git push --set-upstream'을 실행하면 github.com에서 새 PR을 열 옵션이 있는 드롭다운이 있는 전구가 나타납니다

다음은 일부 내장된 빠른 수정 사항입니다:

  • 포트가 이미 수신 중인 경우, 프로세스를 종료하고 이전 명령을 다시 실행하도록 제안합니다.
  • git push가 업스트림이 설정되지 않아 실패한 경우, 업스트림을 설정하여 푸시하도록 제안합니다.
  • git 하위 명령이 유사한 명령 오류로 실패한 경우, 유사한 명령을 사용하도록 제안합니다.
  • git push가 GitHub PR을 생성하라는 제안을 결과로 반환하는 경우, 링크를 열도록 제안합니다.
  • General 또는 cmd-not-found PowerShell 피드백 제공자가 트리거된 경우, 각 제안을 제안합니다.

빠른 수정 기능은 빠른 수정이 가능할 때 추가 피드백을 제공하기 위해 접근성 신호를 지원합니다.

최근 명령 실행

Terminal: Run Recent Command 명령은 다양한 소스의 기록을 빠른 선택으로 제공하여 셸의 역방향 검색(Ctrl+R)과 유사한 기능을 제공합니다. 소스는 현재 세션의 기록, 이 셸 유형의 이전 세션 기록 및 공통 셸 기록 파일입니다.

 "최근 명령 ��실행" 명령은 이전에 실행된 명령을 필터링할 수 있는 빠른 선택을 표시하여 파일로 이동 명령과 유사합니다

명령의 다른 기능:

  • 기본적으로 검색 모드는 "연속 검색"으로, 검색어가 정확히 일치해야 합니다. 검색 입력의 오른쪽 버튼을 사용하여 퍼지 검색으로 전환할 수 있습니다.
  • 현재 세션 섹션에서는 빠른 선택의 오른쪽에 있는 클립보드 아이콘을 클릭하여 명령 출력을 편집기에서 열 수 있습니다.
  • 빠른 선택의 오른쪽에 있는 고정 작업을 사용하여 명령을 목록 상단에 고정할 수 있습니다.
  • Alt를 누르고 있으면 명령을 실행하지 않고 텍스트를 터미널에 작성할 수 있습니다.
  • 이전 세션 섹션에 저장된 기록의 양은 terminal.integrated.shellIntegration.history 설정에 의해 결정됩니다.

이 명령의 기본 키 바인딩은 Ctrl+Alt+R입니다. 그러나 접근성 모드가 켜져 있을 때는 이 키가 반대로 작동합니다. Ctrl+R은 최근 명령을 실행하고 Ctrl+Alt+R은 Ctrl+R을 셸에 보냅니다.

접근성 모드가 꺼져 있을 때 키 바인딩을 전환하려면 다음 키 바인딩을 사용하십시오:

{
"key": "ctrl+r",
"command": "workbench.action.terminal.runRecentCommand",
"when": "terminalFocus"
},
{
"key": "ctrl+alt+r",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "\u0012"/*^R*/ },
"when": "terminalFocus"
}

최근 디렉토리로 이동

최근 명령 실행 기능과 유사하게, Terminal: Go to Recent Directory 명령은 방문한 디렉토리를 추적하고 이를 빠르게 필터링하고 탐색(cd)할 수 있습니다. Alt를 누르고 있으면 명령을 실행하지 않고 텍스트를 터미널에 작성할 수 있습니다.

이 명령의 기본 키 바인딩은 Ctrl+G이며, 편집기의 Go to Line/Column 명령과 유사하게 작동합니다. Ctrl+G는 Ctrl+Alt+G로 셸에 보낼 수 있습니다.

현재 작업 디렉토리 감지

셸 통합은 VS Code에 셸의 현재 작업 디렉토리가 무엇인지 알려줍니다. 이 정보는 Windows에서 프롬프트를 정규식으로 감지하려고 하지 않는 한 얻을 수 없으며, macOS 및 Linux에서는 성능에 좋지 않은 폴링이 필요합니다.

이 기능이 가능하게 하는 가장 큰 기능 중 하나는 터미널에서 링크를 더 잘 해결하는 것입니다. 예를 들어 package.json 링크를 활성화하면 셸 통합이 비활성화된 경우 작업 공간에 여러 package.json 파일이 있는 경우 검색 빠른 선택이 package.json을 필터로 열립니다. 그러나 셸 통합이 활성화된 경우 현재 위치를 알고 있기 때문에 현재 폴더에서 직접 package.json 파일을 엽니다. 이를 통해 예를 들어 ls의 출력이 올바른 파일을 신뢰할 수 있게 열 수 있습니다.

현재 작업 디렉토리는 터미널 탭, 최근 명령 실행 빠른 선택 및 "terminal.integrated.splitCwd": "inherited" 기능에 디렉토리를 표시하는 데에도 사용됩니다.

확장된 PowerShell 키 바인딩

Windows의 콘솔 API는 Linux/macOS 터미널보다 더 많은 키 바인딩을 허용합니다. VS Code의 터미널은 후자를 에뮬레이트하므로 Ctrl+Space와 같은 VT 인코딩이 부족하여 표준 수단을 사용하여 불가능한 일부 PowerShell 키 바인딩이 있습니다. 셸 통합을 통해 VS Code는 PowerShell에서 특수 시퀀스를 보내는 사용자 지정 키 바인딩을 연결하고 셸 통합 스크립트에서 처리하여 적절한 키 핸들러로 전달할 수 있습니다.

셸 통합이 활성화된 경우 다음 키 바인딩이 PowerShell에서 작동해야 합니다:

  • Ctrl+Space: Windows에서만 기본적으로 MenuComplete
  • Alt+Space: 모든 플랫폼에서 기본적으로 SetMark
  • Shift+Enter: 모든 플랫폼에서 기본적으로 AddLine
  • Shift+End: 모든 플랫폼에서 기본적으로 SelectLine
  • Shift+Home: 모든 플랫폼에서 기본적으로 SelectBackwardsLine

실험적 PowerShell IntelliSense

실험적 PowerShell IntelliSense는 PowerShell에서 입력할 때 편집기 경험과 유사하게 완성 목록을 표시합니다. 내부적으로 이 기능은 PowerShell 세션의 네이티브 완성 API에 의해 구동되므로 변수와 같은 컨텍스트 인식 완성이 가능합니다.

PowerShell IntelliSense는 Get-Alias, Get-ChildItem과 같은 완성을 표시합니다. 예를 들어 Get-을 입력할 때

실험적 PowerShell IntelliSense는 terminal.integrated.suggest.enabled 설정으로 활성화할 수 있습니다.

"terminal.integrated.suggest.enabled": true
注記

이 기능은 현재 Windows 및 macOS에서만 사용할 수 있습니다.

Git 및 VS Code 완성

실험적 IntelliSense가 활성화되면 git, code, code-insiders CLI의 완성이 기본적으로 켜집니다. PowerShell 프로필에 이미 완성이 있는 경우 terminal.integrated.suggest.builtinCompletions 설정을 사용하여 이를 끌 수 있습니다.

향상된 접근성

셸 통합이 VS Code에 제공하는 정보는 터미널의 접근성을 향상시키는 데 사용됩니다. 향상된 예는 다음과 같습니다:

  • 접근 가능한 버퍼에서 감지된 명령을 통해 탐색 (Alt+F2)
  • 명령이 실패할 때 오디오 신호가 재생됩니다.
  • 화살표 및 백스페이스 키를 사용할 때 더 올바르게 동작하도록 기본 텍스트 상자 동기화.

지원되는 이스케이프 시퀀스

VS Code는 여러 사용자 지정 이스케이프 시퀀스를 지원합니다:

VS Code 사용자 지정 시퀀스 'OSC 633 ; ... ST'

VS Code에는 VS Code의 터미널에서 셸 통합 기능을 활성화하기 위해 설계된 사용자 지정 이스케이프 시퀀스 세트가 있습니다. 이러한 시퀀스는 내장 스크립트에서 사용되지만 시퀀스를 터미널로 보낼 수 있는 모든 응용 프로그램에서도 사용할 수 있습니다. 예를 들어 Julia 확장은 Julia REPL에서 셸 통합을 지원하기 위해 이를 사용합니다.

이 시퀀스는 다른 터미널에서 무시되어야 하지만, 다른 터미널이 시퀀스를 더 널리 채택하지 않는 한, 이를 작성하기 전에 $TERM_PROGRAMvscode인지 확인하는 것이 좋습니다.

  • OSC 633 ; A ST - 프롬프트 시작 표시.

  • OSC 633 ; B ST - 프롬프트 종료 표시.

  • OSC 633 ; C ST - 사전 실행 표시.

  • OSC 633 ; D [; <exitcode>] ST - 선택적 종료 코드와 함께 실행 완료 표시.

  • OSC 633 ; E ; <commandline> [; <nonce] ST - 선택적 nonce와 함께 명령 줄을 명시적으로 설정합니다.

    E 시퀀스를 사용하면 터미널이 셸에 의해 해석된 정확한 명령 줄을 신뢰할 수 있게 가져올 수 있습니다. 이 시퀀스가 지정되지 않은 경우, 터미널은 명령을 가져오기 위해 A, B 및 C 시퀀스를 사용하거나 감지가 신뢰할 수 없는 경우 감지를 비활성화할 수 있습니다.

    선택적 nonce는 명령 스푸핑을 방지하기 위해 시퀀스가 셸 통합 스크립트에서 온 것인지 확인하는 데 사용할 수 있습니다. nonce가 성공적으로 확인되면 명령을 사용하기 전에 일부 보호가 제거되어 사용자 경험이 향상됩니다.

    명령 줄은 \xAB 형식을 사용하여 ASCII 문자를 이스케이프할 수 있으며, 여기서 AB는 문자 코드의 16진수 표현(대소문자 구분 없음)입니다. \ 문자는 \\를 사용하여 이스케이프할 수 있습니다. 세미콜론(0x3b) 및 0x20 이하의 문자를 이스케이프하는 것이 필수이며, 특히 새 줄 및 세미콜론에 중요합니다.

    몇 가지 예:

    "\"  -> "\\"
    "\n" -> "\x0a"
    ";" -> "\x3b"
  • OSC 633 ; P ; <Property>=<Value> ST - 터미널에 속성을 설정합니다. 알려진 속성만 처리됩니다.

    알려진 속성:

    • Cwd - 터미널에 현재 작업 디렉토리를 보고합니다.
    • IsWindows - 터미널이 winpty 또는 conpty와 같은 Windows 백엔드를 사용하는지 여부를 나타냅니다. 이는 셸 통합 시퀀스의 위치가 정확하지 않을 수 있으므로 추가 휴리스틱을 활성화하는 데 사용할 수 있습니다. 유효한 값은 TrueFalse입니다.

Final Term 셸 통합

VS Code는 Final Term의 셸 통합 시퀀스를 지원하여 VS Code에서 비-VS Code 셸 통합 스크립트가 작동할 수 있습니다. 이는 OSC 633만큼 많은 기능을 지원하지 않기 때문에 다소 저하된 경험을 제공합니다. 지원되는 특정 시퀀스는 다음과 같습니다:

  • OSC 133 ; A ST - 프롬프트 시작 표시.
  • OSC 133 ; B ST - 프롬프트 종료 표시.
  • OSC 133 ; C ST - 사전 실행 표시.
  • OSC 133 ; D [; <exitcode>] ST - 선택적 종료 코드와 함께 실행 완료 표시.

iTerm2 셸 통합

iTerm2가 선도한 다음 시퀀스가 지원됩니다:

  • OSC 1337 ; CurrentDir=<Cwd> S - 터미널의 현재 작업 디렉토리를 설정합니다. OSC 633 ; P ; Cwd=<Cwd> ST와 유사합니다.

  • OSC 1337 ; SetMark ST - 시퀀스가 트리거된 줄의 왼쪽에 마크를 추가하고 스크롤 막대에 주석을 추가합니다:

    시퀀스가 터미널에 작성되면 명령의 왼쪽에 작은 회색 원이 나타나고, 스크롤 막대에 일치하는 주석이 나타납니다

    이러한 마크는 명령 탐색과 통합되어 Ctrl+UpCtrl+Down을 통해 쉽게 탐색할 수 있습니다.

자주 묻는 질문

자동 주입이 작동하지 않는 경우는 언제인가요?

자동 주입이 작동하지 않는 여러 경우가 있습니다. 다음은 일반적인 경우입니다:

  • $PROMPT_COMMAND가 지원되지 않는 형식인 경우, 이를 단일 함수로 가리키도록 변경하는 것이 이를 해결하는 쉬운 방법입니다. 예를 들어:

    prompt() {
    printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"
    }
    PROMPT_COMMAND=prompt
  • 일부 셸 플러그인은 초기화 시 $VSCODE_SHELL_INTEGRATION을 해제하여 VS Code의 셸 통합을 명시적으로 비활성화할 수 있습니다.

기능이 비활성화된 경우에도 명령 데코레이션이 표시되는 이유는 무엇인가요?

이 원인은 시스템에 VS Code가 이해하는 다른 터미널용 셸 통합이 설치되어 있기 때문일 가능성이 큽니다. 데코레이션을 원하지 않는 경우 다음 설정을 사용하여 숨길 수 있습니다:

"terminal.integrated.shellIntegration.decorationsEnabled": never

또는 셸 rc/시작 스크립트에서 셸 통합 스크립트를 제거할 수 있지만, 명령 탐색과 같은 명령 인식 기능을 사용할 수 없게 됩니다.

Windows에서 명령 데코레이션이 이동하는 이유는 무엇인가요?

Windows는 ConPTY라는 에뮬레이트된 가상 터미널(pty) 백엔드를 사용합니다. 이는 Windows 콘솔 API와의 호환성을 유지해야 하기 때문에 일반적인 pty와는 다르게 작동합니다. 이의 영향 중 하나는 셸 통합 시퀀스가 터미널 버퍼에서 명령을 식별하는 위치가 잘못될 수 있다는 것입니다. 명령이 이동하는 것은 일반적으로 명령이 실행된 후 발생하며, VS Code의 휴리스틱이 명령 데코레이션의 위치를 개선하기 위해 작동한 결과입니다.