가장 간단한 형태로 프로그램은 터미널 명령 만 실행합니까?


18

예를 들어 프로그램에서 하나의 폴더를 선택하고 다른 위치로 복사 할 수 있습니다. 기본적으로 터미널에서 실행할 수있는 명령을 실행하는 응용 프로그램이거나 내부 OS API를 사용하여 이동합니까?

악의적 인 답변을 남겨주세요. 나는 단지 13 세의 질문으로 인식 될 수 있다는 것이 궁금하고 완전히 알고 있습니다.


4
다른 질문에 오신 것을 환영합니다! 어떤 질문은 다른 질문보다 더 발전된 것이므로 괜찮습니다. 사과 할 필요가 없습니다. Apple 하드웨어, Apple 소프트웨어, 기타 Apple 제품 또는 서비스, 타사 하드웨어 및 Apple 제품 용 소프트웨어에 대한 질문이 있고 FAQ에서 금지 된 주제 에 관한 것이 아니라면 귀하는 질문을 바로 할 수 있습니다 ! 따라서 귀하의 질문이 주제에 관한 것이면, 귀하 13 세 ( 서비스 약관에 따라 더 젊지 않음) 인 경우에도 환영합니다 .
다니엘

3
좋은 질문-이 질문에 대한 최소한 3 가지의 사소한 수준의 답변이 있습니다. 이것이 기본적인 답변, 중간 답변 및 "John Siracusa가 Mac OS X 응용 프로그램 바이너리 구조의 내부 작업을 해부"수준의 답변을 얻었으므로 모든 것을 선택하고 배울 수 있기를 바랍니다.
bmike

답변:


11

개념 상으로는 항상 OS API를 사용합니다. 질문은 어떤 방식으로 만 진행됩니다. 본질적으로 세 가지 옵션이 있습니다.

  1. 저수준 OS API (시스템 호출)를 직접 사용합니다. 귀하의 예에서 작업은 매우 관련이 있습니다. 폴더의 항목 목록을 가져오고 유형 (폴더, 파일 ...)을 확인하십시오. 각 항목은 대상 폴더에서 해당 항목을 작성하고 파일은 소스, 대상 파일 등에 쓰기 등. 작업이 너무 복잡하기 때문에 문제가 발생하기 쉽기 때문에 대부분의 응용 프로그램에서이를 피할 수 있습니다.

  2. 작업을 단순화하는 라이브러리 (API)를 사용하십시오. 예를 들어, Apple Cocoa 프레임 워크는 하위 수준의 OS API를 사용하여 모든 더러운 작업을 수행 NSFileManager하는 copyItemAtPath:toPath:error메소드를 클래스에 제공 하므로 응용 프로그램은 하위 수준의 API 자체를 사용할 필요는 없지만 적은 작업이 필요하고 항상 필요한 것에 의존 할 수 있습니다 시스템에 존재합니다. 또한 Apple은 잘 작동하는지 확인합니다.

  3. 외부 프로세스를 사용하여 작업을 수행하십시오. 이 경우 외부 프로세스는 위의 두 가지 방법 중 하나를 사용하여 작업을 수행합니다. 응용 프로그램은 이러한 프로세스를 시작하고 모니터링 한 후 완료 될 때까지 기다려야합니다. 이러한 프로세스는 명령 행 도구로 실행될 수 있으므로 터미널에서 실행할 수있는 명령 일 수 있습니다. 보장되지는 않지만 매우 가능합니다.

대부분의 응용 프로그램은 옵션 2를 1보다 간단하고 3보다 안전하고 효율적이기 때문에 옵션 2를 사용합니다. 외부 프로세스를 실행하려면 적절하게 설정해야하며 작업을 제어 할 수 없습니다. 예를 들어, 실패한 경우 정확히 무엇이 잘못되었는지 파악하기가 훨씬 어렵고 그것이 무엇을하고 있는지 알기가 어렵습니다 (예 : 진행 상황 표시). 그렇기 때문에 대부분의 경우 개발자는 옵션 2를 선택할 가능성이 있지만 보장 할 수는 없습니다. 주목할만한 예로는 설치 프로그램과 같이 사용자 지정을 위해 셸 스크립트를 사용하는 응용 프로그램이 있습니다.

고급 사용자 참고 사항 : dtraceOS X 기능을 사용 하여 특정 애플리케이션이 수행중인 작업을 찾을 수 있습니다. 예를 들어, 생성중인 프로세스를 확인할 수 있으므로 사용중인 도구를 볼 수 있습니다 (참조 execsnoop).


4

나는 대답이 "의존하지만 보통 두 번째"인 것이 두렵다. 실제로 GUI 프로그램이 터미널 명령을 실행하더라도 API를 호출하여 실행합니다.

단순히 터미널 명령 목록 인 프로그램을 쉘 스크립트라고합니다. 이러한 프로그램은 Mac OS X에서 실행될 수 있지만, 출력을 보려면 터미널 창에서 실행하거나 GUI를 사용하는 프로그램을 실행해야합니다. 다른 프로그램은 내부 API를 통해 명령 행 프로그램을 호출 할 수 있습니다.

대부분의 개발 질문은이 사이트에서 주제를 벗어난 것이지만 실제로 주제가되는 한 가지 예는 Automator를 실행하는 것입니다.

Automator에서 생성 된 프로그램이 호출 할 수있는 내부 명령 목록 내의 옵션 중 하나는 쉘 스크립트 또는 터미널 명령 목록을 호출하는 기능입니다. 그러나 그것은 내부 API 내에서 사용 가능한 많은 옵션 중 하나입니다.

여기에 이미지 설명을 입력하십시오


그러나 때때로 API는 터미널에서 액세스 할 수있는 명령을 호출하게됩니다. /sbin/shutdown손상되었거나 삭제 된 경우 Apple 메뉴의 시스템 종료 명령이 작동하지 않는다는 보고서를 읽었습니다 (내 컴퓨터에서 복제 할 필요는 없습니다. 대단히 감사합니다) .
다니엘

1
쉘 스크립트는 터미널 창이나 다른 소프트 윈도우에서 실행될 필요가 없습니다. 그러나 파일로 리디렉션되지 않은 출력을 생성하면 창에서 실행하도록 선택할 수 있습니다. 쉘 스크립트는 윈도우가있는 다른 프로그램을 실행할 수도 있습니다.
ctrl-alt-delor

@richard 절대적으로 맞습니다. 편집했습니다.
Daniel

2

유닉스의 훌륭한 아이디어 중 하나는 프로그램에 대한 아이디어가 있다면 먼저 쉘 스크립트로 작성한다는 것입니다. 본질적으로 일련의 명령을 호출합니다.

그런 다음 프로그램이 유용한 것으로 판명되면 인터페이스를 개선하고 사용자가 테스트하도록하고 마지막으로 가치가 있다고 확신하면 "실제"프로그램을 작성하십시오.

물론 이것은 그래픽 사용자 인터페이스가 인수되기 이전의 것이기 때문에 "프로그램"은 CLI 명령 자체입니다.

일부 최신 프로그램, 특히 시스템 정보가 표시되는 경우에도 이러한 접근 방식이 계속 나타납니다. 폴더에있는 모든 파일을 나열하는 간단한 앱을 만들고 싶습니까? 그냥 실행 ls -al하고 결과를 구문 분석하고 표를 표시하십시오. 다양한 매개 변수를 가지고 재미 있고 버전 2.0에 대한 자료가 있습니다.


1

터미널 명령을 실행하는 하나의 프로그램 클래스 (모두 API 호출로 시작하더라도)는 일식 또는 Xcode와 같은 통합 프로그램 개발 환경입니다. 프로그램 개발에 필요한 도구 모음은 IDE에 포함되어 유지 관리하기에 엄청나게 큽니다. 대신, makefile (일종의 스크립트)을 빌드하고 컴파일, 링크,로드 및 디버그 프로세스를 단계별로 수행하기 위해 유닉스 'make'(또는 이에 상응하는)로 실행합니다. 차례로 명령 행 인터페이스를 사용하여 컴파일러, 링커 등을 실행하십시오. 이를 통해 IDE는 프로그래머가 선택한 도구 세트와 상대적으로 독립적이며 도구 업데이트에 영향을받지 않습니다.


1

응용 프로그램은 CLI 명령을 실행하여 특정 작업을 수행 할 수 있으며 실제로는 일부 작업을 수행 할 수 있습니다. 그러나 효율성 문제로 인해 전문 응용 프로그램 개발자는 명령 실행을 피하고 명령이 필요한 작업을 수행하는 데 사용하는 API 를 사용합니다.


저는 전문 소프트웨어 엔지니어입니다. 내 프로그램에서 명령을 호출합니다. 나는 심지어 그들 자신의 일부 또는 전부를 쓴 다음 다른 언어로 GUI를 쓸 것입니다. 그러나 복사하거나 이름을 바꾸는 API가 간단하기 때문에 cp (복사) 또는 mv (이동 / 이름 바꾸기) 명령을 사용하지 않습니다. 일부 자유 소프트웨어 프로젝트는이 기술을 사용합니다. 일부 전문가들은 명령 줄 도구를 사용하기는 쉽지만 (예를 들어 iso cd 이미지를 작성하고 이미지를 cd에 작성하기 위해) 작성하기를 기대했지만 GUI 전문가는 이러한 도구를 모두 사용하는 GUI를 작성하여 기본적으로 사용자가 도구를 구성 할 수있게했습니다. , 진행 상황을 모니터링하고 진행 상황을 모니터링합니다.
ctrl-alt-delor

내가 사용하는 API를 바로 질문을 사용하는 것이 간단한 단어로. 실제로, 나는 언더 레이 딩 코드와 API vs libs vs Frameworks 등의 명명 규칙에 익숙하지 않은 독자를 위해 매번 답변을 여러 번 다시 작성했습니다. 다른 전문 소프트웨어 엔지니어. 내 게시물에 문제를 더 명확하게 설명 할 내용이 있으면 계속 진행하십시오.
ismail

위법 행위는 없습니다. 나는 단지 명확히하고 있습니다. 좋은 프로그래머는 커맨드 라인 프로그램을 호출하거나 호출하지 않을 것입니다. 결정은 복잡성 및 가능한 경우 (속도 측정 후) 효율성에 기반합니다. 시장에 판매하는 소규모 전문가 그룹의 경우 프로그램을 복잡하게 만들어야 할 수도 있습니다. 커맨드 라인 프로그램을 호출하면 간단 해 보일 수 있습니다. 따라서 다시 작성해야합니다. 커미션이나 자유 소프트웨어를 사용하는 경우 가장 간단한 방법을 사용하십시오.
ctrl-alt-delor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.