클라이언트나 회사를 위해 매일 서버 환경 유지 관리를 수행하지 않고 개인 프로젝트를 위해 가끔씩 서버 환경 유지 관리를 수행하는 일반 청중/비전문 시스템 관리자를 대상으로 "프로세스 대체"라는 용어에 대한 간단한 설명이 요청될 수 있는지 찾고 있습니다. 여기라면.
- 이 개념은 어떤 문제를 해결하기 위해 고안되었습니까?
- 대체되는 프로세스는 무엇이며 이름이 오해의 소지가 있을 수 있습니까?
- "표준 입력 유지"라고도 합니까? 그렇다면 왜? stdin 장치가 다른 명령으로 파이프될 수 있는 표준 입력을 보유하고 있다면 "보존"할 수 있는 또 다른 것은 무엇입니까?
이는 다음 명령을 이해하는 데 도움이 될 수 있습니다.
bash <(wget -O - URL)
신규 이민자를 위한 참고 사항: -O -
wget
데이터를 표준 출력에 기록하도록 지시합니다 .
답변1
중요한 사실: 두 개의 껍질이 관련되어 있습니다.
먼저 두 개의 껍질이 관련되어 있다는 점에 유의하십시오. 당신이 일하고 bash <(wget -O - URL)
전화하는 외부 Bash . 명령이 실행되면 내부 Bash는 외부 Bash의 하위 프로세스로 실행됩니다.
즉, 외부 Bash는 bash <(wget -O - URL)
명령을 받아들이고 내부 Bash를 생성합니다. 적절한 경우 두 가지를 구별하겠습니다.
중요한 사실: Bash로 코드를 실행하는 방법은 여러 가지가 있습니다.
(내부적으로) Bash가 일부 코드를 실행하도록 하는 방법에는 여러 가지가 있습니다.
bash
코드는 표준 입력에서 읽을 수 있습니다.echo 'date; sleep 2; date' | bash
표준 입력은 콘솔이 될 수 있습니다. 예를 들어 일반적으로 작동하는 상호 작용은
bash
콘솔에서 읽지만 실제로는 표준 입력에서 읽습니다.예표준 입력입니다.bash
코드는 파일에서 읽을 수 있습니다.bash /path/to/some/file
(경로는 상대적일 수 있습니다.)
bash
명령줄 인수에서 코드를 읽을 수 있습니다.bash -c 'date; sleep 2; date'
문맥
댓글에서 맥락은 다음과 같다고 말씀하셨습니다.이 문제. 내 대답은 다음을 교체하는 것을 제안합니다.
wget -O - URL | bash
그리고
bash <(wget -O - URL)
첫 번째 명령은 내부가 bash
표준 입력에서 읽도록 합니다. 두 번째 명령이 bash
표준 입력이 아닌 파일을 내부적으로 읽게 한다는 사실을 깨닫지 못하는 것 같습니다 .
무슨 일이야<(…)
Bash에서 실행 하면 외부 Bash가 특정 경로로 bash <(wget -O - URL)
대체됩니다 .<(…)
문서. 대체 후 실제 명령 실행은 다음과 같습니다.
bash /dev/fd/63
그러면 내부 Bash가 생성됩니다. /dev/fd/63
열릴 것처럼 열립니다 /path/to/some/file
.
프로세스 교체의 "마법" 덕분에 /dev/fd/63
파이프는 이미 에 연결되어 있습니다 wget -O - URL
.
참고 사항: /dev/fd
이를 사용할 수 없는 시스템에서 외부 Bash는 실제 명명된 파이프(예 /tmp/sh-np.pldKay
: .
유사성
두 경우 모두에서 wget
(내부)로의 연결은 유사합니다. bash
을 실행하면 wget -O - URL | bash
코드 는 파이프가 쓰는 bash
표준 입력에서 읽습니다 . wget
를 실행하면 bash <(wget -O - URL)
파이프가 작성한 다른 파일 bash
(즉, 표준 입력이 아닌)에서 코드를 읽습니다. wget
두 경우 모두 외부 Bash가 파이프를 설정합니다.
차이점
차이점은 프로세스 대체의 경우 내부 Bash의 표준 입력이 코드를 전달하는 데 사용되지 않는다는 것입니다. 표준 입력은 다른 목적으로 사용될 수 있습니다. 예를 들어 표준 입력은 콘솔이 될 수 있으며 read
코드에서 읽을 수 있습니다.
귀하의 명확한 질문에 대한 답변
-
이 개념은 어떤 문제를 해결하기 위해 고안되었습니까?
명령에 경로 이름(파일 경로)이 필요하고 일반 파일을 제공하는 대신 무언가를 파이프하려는 경우 명명된 파이프를 만들어 목표를 달성할 수 있습니다. 이를 위해서는 실제로 파이프(
mkfifo
)를 만들고 파이프에 무언가를 파이프하고(백그라운드 또는 다른 콘솔에서) 명령을 실행하고 마지막으로 명명된 파이프(rm
)를 삭제해야 합니다.프로세스 대체를 통해 Bash는 파이프를 처리할 수 있습니다. 매우 편리합니다.
-
어떤 프로세스가 대체되고 있나요? 무엇으로 교체할까요?
bash <(wget -O - URL)
명령(및 유사한 명령)을 실행하기 전에 구문<(wget -O - URL)
을 파일 경로로 바꾸 십시오bash /dev/fd/63
. 외부 Bash는 파일을 준비하므로 파일을 읽는다는 것은wget -O - URL
(프로세스가) 쓴 내용을 읽는다는 의미입니다. 파일은 실제로 일반 파일이 아닌 파이프입니다. -
"표준 입력 유지"라고도 합니까? 그렇다면 왜?
"표준 입력 유지"가 발생하지만 프로세스 교체를 위한 대체 이름은 아닙니다. 이것은 아니다공식적인일어난 일의 이름.
(외부) Bash 내에서 (내부) 실행 하면
bash …
내부 Bash는 외부 Bash로부터 표준 입력을 상속받습니다(즉, 동일한 파일입니다). 표준 입력은 콘솔일 수 있습니다.그러나 대신 실행하면 Bash 내부적으로 자체 표준 입력의 데이터가
wget … | bash …
표시됩니다 .wget
이제 내부 Bash의 일부(예:read
내장) 또는 Bash 내부의 일부 하위 프로세스가 stdin에서 무언가를 읽고 싶어할 수 있습니다. 그들은 콘솔 같은 것으로부터 입력을 기대하지만,아니요내부적으로 Bash는 코드를 실행해야 합니다. 그러나 내부적으로 Bash의 표준 입력은 파이프에서 나오므로wget
내장 기능은 이를 사용하고 하위 프로세스는 이를 다음과 같이 상속합니다.그들의표준 입력. 외부 Bash의 표준 입력을 상속하지 않습니다.(내부) 표준 입력을 통해 코드를 파이핑하는 대신 프로세스 대체를 사용하면
bash
외부 Bash의 표준 입력을 내부 Bash의 내장 함수 및 하위 항목에서 사용할 수 있게 만들 수 있습니다. 너구하다내장 기능과 내부 Bash의 자식이 사용하는 외부 Bash에 대한 표준 입력입니다. 동시에 Bash가 내부적으로 읽고 실행하는 코드 흐름을 내장 함수나 하위 함수가 읽지 못하도록 보호할 수 있습니다.bash
이는 명령줄 인수로 지정된 파일에 코드를 제공할 수 있기 때문에 작동합니다 . (내부적으로) Bash가 stdin에서 코드 읽기만 지원하는 경우 stdin을 통해 코드를 제공해야 합니다. 이 경우 프로세스 대체로는 문제를 해결할 수 없습니다.당신이 직면한 문제.