쉘
=====

Shell은 프로그램을 실행하고 통신하기 위한 기본 수단입니다. 대부분은 공식 Python REPL
(Read-Evaluate-Print Loop)처럼 보이지만 몇 가지 차이점과 추가 기능이 있습니다.

파이썬 커맨드
---------------
공식 Python REPL과 마찬가지로 Thonny에서의 Shell은 단일행과 여러행 모두에서
Python 표현식과 문을 허용합니다. Enter 키를 누르면 Thonny는 몇가지 휴리스틱을 사용하여
명령을 제출할지 혹은 다음 줄에 명령을 계속 입력할지를 예측합니다.
만약 명령을 제출하고 싶지만 Thonny가 새 줄을 제공한다면 괄호를 닫는 것을
잊었는지 확인하세요.

매직 커맨드
--------------
"실행 => 현재 스크립트 실행"을 선택하거나 F5를 누르면 Thonny가 ``% Run`` 으로 시작하는 명령을
쉘에 삽입하는 방법을 볼 수 있습니다. ``%`` 로 시작하는 명령을 *매직 커맨드* 이라고 하며
(`IPython <https://ipython.org/>`_ 에서와 같이) Python 명령으로 (쉽게) 표현할 수 없는
특정 작업을 수행합니다. Thonny의 매직 커맨드에는 일반적으로 해당 메뉴 명령이 있으므로
직접 작성할 필요는 없습니다.

시스템 커맨드
---------------
간단한 시스템 명령을 빠르게 실행해야 할 경우 경우 터미널을 시작할 필요가 없습니다. 그냥
명령 앞에 ``!`` (예 : ``! pytest my-script.py``)를 붙이고 Thonny의 쉘에 입력하면됩니다.

커맨드 히스토리
---------------
동일하거나 유사한 명령을 여러 번 실행하려는 경우 매번 입력 할 필요가 없습니다. 위 방향키 를 사용하여
명령 기록에서 이전 명령을 가져옵니다. 위 방향키를 더 누르면 그 전에 사용되었던
명령을 제공합니다. 명령 기록의 반대 방향으로 이동하려면 아래 방향키를 사용하면 됩니다.

색을 입힌 출력
--------------
셸이 터미널 에뮬레이션 모드 (도구 => 옵션 => 셸 참조) 인 경우 `ANSI 코드 <https://en.wikipedia.org/wiki/ANSI_escape_code>`_
를 사용하여 색이 있는 화면으로 만들 수 있습니다.

다음의 예를 실행해보세요:

.. code::

	print("\033[31m" + "Red" + "\033[m")
	print("\033[1;3;33;46m" + "Bright&bold italic yellow text on cyan background" + "\033[m")

`colorama <https://pypi.org/project/colorama/>`_와 같은 패키지를 사용해서
색상 코드를 생성할 수 있습니다.

출력 라인들을 덮어씌우기
------------------------
적절한 터미널 에뮬레이터는 터미널 화면에서 임의의 위치에 쓸 수있는 ANSI 코드를 지원합니다.
Thonny에서 쉘은 엄청 유용하지는 않지만 몇가지 간단한 트릭들을 지원합니다.

다음의 예를 실행해보세요:

.. code::

	from time import sleep
	
	for i in range(100):
	    print(i, "%", end="")
	    sleep(0.05)
	    print("\r", end="")
	
	print("Done!")

이 트릭은 문자`` "\ r"``에 의존하며, 출력 커서가 현재 줄의 시작 부분으로 돌아가서 다음 출력이
이전에 출력된 텍스트를 덮어 씁니다. 새로운 라인을 만들지 않기 위해 ``print (..., end = "")``
를 사용하는 방법이 있으니 참고하세요.

``"\ r"`` 과 짝은``"\ b"`` 이며 출력 커서를 한문자 씩 왼쪽으로 이동합니다.
만약 이미 커서가 줄의 첫번째 위치에 있으면 아무런 작업도 수행하지 않습니다.
		
소리 내기
------------
쉘이 터미널 에뮬레이션 모드에 있을 때, 문자 ``"\ a"`` 를 출력하여 벨 (혹은 "딩") 사운드를
생성 할 수 있습니다.

이미지 보이기
-----------------
Base64로 GIF 또는 PNG 파일을 인코딩 하고 한 줄의 데이터 URL로 출력하여
아래와 같이 쉘에 이미지를 표시 할 수 있습니다:

.. code::

	print("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")
		
 
일련의 숫자들을 플로팅(그리기)
--------------------------
`Plotter <plotter.rst>`_ 를 사용하여 쉘에 인쇄된 일련의 숫자를 시각화 할 수 있습니다.
