아나콘다를 깔면 위와 같이 아나콘다 프롬프트도 같이 깔린다.
이것은 사실 .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%"
사실상 이 배치파일이 실행되는 것이 맞다 하더라도 %*를 통해 전달되는 매개 변수 인자들이 무엇인지 모르겠다. 그래서 배치파일은 여기까지만 까보도록 하자.
실행되는 배치 파일을 전부 파악하진 못했다.
그러나 아나콘다 프롬프트는 cmd 명령 프롬프트 위에서 돌아가며, 꽤 많은 배치 파일들이 종속되어서 실행된다.
원래의 목적은 아나콘다 프롬프트에 심볼릭 링크를 만들려고 까본 것인데 이것은 WSL을 통해서 만들어야겠다.