anaconda prompt 까보기

sith-call.dev·2021년 9월 10일
0

Let's dive into the prompt!

아나콘다를 깔면 위와 같이 아나콘다 프롬프트도 같이 깔린다.

이것은 사실 .lnk 파일 형식의 바로가기 파일이다.

아나콘다 프롬프트 파일 마우스 우클릭 -> 속성

속성을 한 번 봐보자

대상 칸에 적혀 있는 것을 살펴보자

%windir%\System32\cmd.exe "/K" C:\Users\wsChoe\anaconda3\Scripts\activate.bat C:\Users\wsChoe\anaconda3

그러면 위와 같은 것이 들어가 있는데 이것은 아마도 윈도우+R 키를 누르면 나타나는 실행 프로그램의 명령어로 들어가는 듯 하다.

왜냐하면 실행 프로그램에서 CMD의 /K라는 옵션을 주어 명령 프롬프트를 실행시키는 방법이 있기 때문이다. 이것은 명령 프롬프트가 명령어를 처리한 이후에 세션을 유지하라는 옵션이다.

그러면 위의 명령어를 해석해보자면, CMD에서 /K 옵션으로
C:\Users\wsChoe\anaconda3\Scripts\activate.bat C:\Users\wsChoe\anaconda3
위의 명령어를 처리하라는 뜻이다. 이것은 Scripts 폴더에 있는 activate.bat이란 배치 파일을 C:\Users\wsChoe\anaconda3이란 매개변수 인자를 넣어서 실행하라는 뜻이다.

그렇다면 배치파일을 한 번 까보자.

@REM Copyright (C) 2012 Anaconda, Inc
@REM SPDX-License-Identifier: BSD-3-Clause
@REM Test first character and last character of %1 to see if first character is a "
@REM   but the last character isn't.
@REM This was a bug as described in https://github.com/ContinuumIO/menuinst/issues/60
@REM When Anaconda Prompt has the form
@REM   %windir%\system32\cmd.exe "/K" "C:\Users\builder\Miniconda3\Scripts\activate.bat" "C:\Users\builder\Miniconda3"
@REM Rather than the correct
@REM    %windir%\system32\cmd.exe /K ""C:\Users\builder\Miniconda3\Scripts\activate.bat" "C:\Users\builder\Miniconda3""
@REM this solution taken from https://stackoverflow.com/a/31359867
@set "_args1=%1"
@set _args1_first=%_args1:~0,1%
@set _args1_last=%_args1:~-1%
@set _args1_first=%_args1_first:"=+%
@set _args1_last=%_args1_last:"=+%
@set _args1=

@if "%_args1_first%"=="+" if NOT "%_args1_last%"=="+" (
    @CALL "%~dp0..\condabin\conda.bat" activate
    @GOTO :End
)

@REM This may work if there are spaces in anything in %*
@CALL "%~dp0..\condabin\conda.bat" activate %*

:End
@set _args1_first=
@set _args1_last=

배치파일의 확장자를 .txt를 바꿔서 스크립트 언어 코드로 살펴보았다.
여기서 %1은 C:\Users\wsChoe\anaconda3를 뜻한다. 그리고 위의 스크립트 파일이 실행되면 if문 블럭은 실행되지 않는다. 시험 삼아 내가 코드를 변경해서 얻은 결과를 살펴보자.

@REM Copyright (C) 2012 Anaconda, Inc
@REM SPDX-License-Identifier: BSD-3-Clause
@REM Test first character and last character of %1 to see if first character is a "
@REM   but the last character isn't.
@REM This was a bug as described in https://github.com/ContinuumIO/menuinst/issues/60
@REM When Anaconda Prompt has the form
@REM   %windir%\system32\cmd.exe "/K" "C:\Users\builder\Miniconda3\Scripts\activate.bat" "C:\Users\builder\Miniconda3"
@REM Rather than the correct
@REM    %windir%\system32\cmd.exe /K ""C:\Users\builder\Miniconda3\Scripts\activate.bat" "C:\Users\builder\Miniconda3""
@REM this solution taken from https://stackoverflow.com/a/31359867
echo %1
set "_args1=%1"
echo %_args1%
@set _args1_first=%_args1:~0,1%
@set _args1_last=%_args1:~-1%
echo %_args1_first%
echo %_args1_last%
@set _args1_first=%_args1_first:"=+%
@set _args1_last=%_args1_last:"=+%
echo %_args1_first%
echo %_args1_last%
@set _args1=

@if "%_args1_first%"=="+" if NOT "%_args1_last%"=="+" (
    echo "HI"
    @CALL "%~dp0..\condabin\conda.bat" activate
    @GOTO :End
)

@REM This may work if there are spaces in anything in %*
echo "hello"
@CALL "%~dp0..\condabin\conda.bat" activate %*

:End
@set _args1_first=
@set _args1_last=

그렇다면 위의 배치 파일이은 call이란 명령어를 통해서
@CALL "%~dp0..\condabin\conda.bat" activate %*
condabin\conda.bat을 실행시킨다. 아마도 이 condabin 폴더는 anaconda3라는 폴더 안에 있는 것이라 생각이 됐다. 그럼 이 배치 파일도 까보자. 참고로 call이란 명령어는 배치 파일이 실행되는 도중에 다른 배치 파일을 실행시킬 수 있는 명령어이다. 아래에 명령어 참고 사이트를 첨부하겠다.

@REM Copyright (C) 2012 Anaconda, Inc
@REM SPDX-License-Identifier: BSD-3-Clause

@REM echo _CE_CONDA is %_CE_CONDA%
@REM echo _CE_M is %_CE_M%
@REM echo CONDA_EXE is %CONDA_EXE%

@IF NOT DEFINED _CE_CONDA (
  @SET _CE_M=
  @SET "CONDA_EXE=%~dp0..\Scripts\conda.exe"
)
@IF [%1]==[activate]   "%~dp0_conda_activate" %*
@IF [%1]==[deactivate] "%~dp0_conda_activate" %*

@SETLOCAL EnableDelayedExpansion
@IF DEFINED _CE_CONDA (
  @REM when _CE_CONDA is defined, we're in develop mode.  CONDA_EXE is actually python.exe in the root of the dev env.
  FOR %%A IN ("%CONDA_EXE%") DO @SET _sysp=%%~dpA
) ELSE (
  @REM This is the standard user case.  This script is run in root\condabin.
  FOR %%A IN ("%~dp0.") DO @SET _sysp=%%~dpA
  IF NOT EXIST "!_sysp!\Scripts\conda.exe" @SET "_sysp=!_sysp!..\"
)
@SET _sysp=!_sysp:~0,-1!
@SET PATH=!_sysp!;!_sysp!\Library\mingw-w64\bin;!_sysp!\Library\usr\bin;!_sysp!\Library\bin;!_sysp!\Scripts;!_sysp!\bin;%PATH%
@SET CONDA_EXES="%CONDA_EXE%" %_CE_M% %_CE_CONDA%
@CALL %CONDA_EXES% %*
@ENDLOCAL

@IF %errorlevel% NEQ 0 EXIT /B %errorlevel%

@IF [%1]==[install]   "%~dp0_conda_activate" reactivate
@IF [%1]==[update]    "%~dp0_conda_activate" reactivate
@IF [%1]==[upgrade]   "%~dp0_conda_activate" reactivate
@IF [%1]==[remove]    "%~dp0_conda_activate" reactivate
@IF [%1]==[uninstall] "%~dp0_conda_activate" reactivate

@EXIT /B %errorlevel%

이때 매개변수 인자로 activate가 들어갔다. 그렇다면

@IF [%1]==[activate] "%~dp0_conda_activate" %*

이 코드가 실행될 것이다. 아마도 이 코드는 condabin 폴더 안에 있는 conda_activate.bat을 실행시키는 코드가 아닐까 싶지만, 저 부분의 스크립트 언어를 확실하게 해석을 못하겠다. 해당 배치 파일의 코드도 한번 봐보자.

@REM Copyright (C) 2012 Anaconda, Inc
@REM SPDX-License-Identifier: BSD-3-Clause
@REM Helper routine for activation, deactivation, and reactivation.

@IF "%CONDA_PS1_BACKUP%"=="" GOTO FIXUP43
    @REM Handle transition from shell activated with conda 4.3 to a subsequent activation
    @REM after conda updated to 4.4. See issue #6173.
    @SET "PROMPT=%CONDA_PS1_BACKUP%"
    @SET CONDA_PS1_BACKUP=
:FIXUP43

@SETLOCAL EnableDelayedExpansion
@IF DEFINED _CE_CONDA (
  @REM when _CE_CONDA is defined, we're in develop mode.  CONDA_EXE is actually python.exe in the root of the dev env.
  FOR %%A IN ("%CONDA_EXE%") DO @SET _sysp=%%~dpA
) ELSE (
  @REM This is the standard user case.  This script is run in root\condabin.
  FOR %%A IN ("%~dp0.") DO @SET _sysp=%%~dpA
  IF NOT EXIST "!_sysp!\Scripts\conda.exe" @SET "_sysp=!_sysp!..\"
)
@FOR %%A in ("%TMP%") do @SET TMP=%%~sA
@SET _sysp=!_sysp:~0,-1!
@SET PATH=!_sysp!;!_sysp!\Library\mingw-w64\bin;!_sysp!\Library\usr\bin;!_sysp!\Library\bin;!_sysp!\Scripts;!_sysp!\bin;%PATH%
@REM It seems that it is not possible to have "CONDA_EXE=Something With Spaces"
@REM and %* to contain: activate "Something With Spaces does not exist".
@REM MSDOS associates the outer "'s and is unable to run very much at all.
@REM @SET CONDA_EXES="%CONDA_EXE%" %_CE_M% %_CE_CONDA%
@REM @FOR /F %%i IN ('%CONDA_EXES% shell.cmd.exe %*') DO @SET _TEMP_SCRIPT_PATH=%%i not return error
@REM This method will not work if %TMP% contains any spaces.
@FOR /L %%I IN (1,1,100) DO @(
    SET UNIQUE_DIR=%TMP%\conda-!RANDOM!
    MKDIR !UNIQUE_DIR! > NUL 2>&1
    IF NOT ERRORLEVEL 1 (
        SET UNIQUE=!UNIQUE_DIR!\conda.tmp
        TYPE NUL 1> !UNIQUE!
        GOTO tmp_file_created
    )
)
@ECHO Failed to create temp directory "%TMP%\conda-<RANDOM>\" & exit /b 1
:tmp_file_created
@"%CONDA_EXE%" %_CE_M% %_CE_CONDA% shell.cmd.exe %* 1>%UNIQUE%
@IF %ErrorLevel% NEQ 0 @EXIT /B %ErrorLevel%
@FOR /F %%i IN (%UNIQUE%) DO @SET _TEMP_SCRIPT_PATH=%%i
@RMDIR /S /Q %UNIQUE_DIR%
@FOR /F "delims=" %%A in (""!_TEMP_SCRIPT_PATH!"") DO @ENDLOCAL & @SET _TEMP_SCRIPT_PATH=%%~A
@IF "%_TEMP_SCRIPT_PATH%" == "" @EXIT /B 1
@IF NOT "%CONDA_PROMPT_MODIFIER%" == "" @CALL SET "PROMPT=%%PROMPT:%CONDA_PROMPT_MODIFIER%=%_empty_not_set_%%%"
@CALL "%_TEMP_SCRIPT_PATH%"
@IF NOT "%CONDA_TEST_SAVE_TEMPS%x"=="x" @ECHO CONDA_TEST_SAVE_TEMPS :: retaining activate_batch %_TEMP_SCRIPT_PATH% 1>&2
@IF "%CONDA_TEST_SAVE_TEMPS%x"=="x" @DEL /F /Q "%_TEMP_SCRIPT_PATH%"
@SET _TEMP_SCRIPT_PATH=
@SET "PROMPT=%CONDA_PROMPT_MODIFIER%%PROMPT%" 

사실상 이 배치파일이 실행되는 것이 맞다 하더라도 %*를 통해 전달되는 매개 변수 인자들이 무엇인지 모르겠다. 그래서 배치파일은 여기까지만 까보도록 하자.

Conclusion

실행되는 배치 파일을 전부 파악하진 못했다.

그러나 아나콘다 프롬프트는 cmd 명령 프롬프트 위에서 돌아가며, 꽤 많은 배치 파일들이 종속되어서 실행된다.

원래의 목적은 아나콘다 프롬프트에 심볼릭 링크를 만들려고 까본 것인데 이것은 WSL을 통해서 만들어야겠다.

참고사이트

  1. https://ss64.com/nt/
  2. https://whatis.techtarget.com/fileformat/LNK-Shortcut-file-Microsoft-Windows-9-x
profile
lim (time → ∞) Life(time) = LOVE

0개의 댓글