2013-11-26 1 views
3

현재 리디렉션, 파이프, exec 등의 작은 쉘을 코딩하고 있습니다. I/O 리다이렉션 문제를 해결하기 위해 리눅스 쉘이 취하는 단계들을 알아 내려고 노력했다.Linux 쉘에서 입출력 스트림 재 지정. 쉘은 리다이렉션 명령을 어떻게 처리합니까?

나는에 도움이 필요한 것에 대한 몇 가지 질문 : 그것은 리디렉션을 찾는 경우

  1. 어느 방향에서 쉘 명령 행에서 읽어 않습니다를? 왼쪽에서 오른쪽 또는 그 반대? 재귀를 사용합니까?

  2. 셸에서 검색해야하는 경우는 무엇입니까? (확실하지 않은 변화를 많이 포함 할 수 많은 또는 단지 몇이있는 경우) 어쨌든

가, 일부는 내가 생각할 수있는 (내가 틀렸다면 정정 해줘)입니다

cmd > file1  # stdout of cmd goes to file 

cmd file1 > file2 # stdout of cmd with file1 as an argument goes to file2 

cmd file2 < file1 # stdin on file2 comes from file1 

이제 다음과 같은 경우에 프로세스를 알지 못합니다 (쉘이이를 찾는 방법과 같이). 쉘이 소요 단계는 당신이 단지 표준 입력과 표준 출력의 리디렉션이 문제 때문에 지난 두 예제가 정확히 동일하지 않습니다 처리되는 순서를 재 지정으로

cmd file2 > file3 < file1 # using "tee" in place of "cmd" I don't know 
          # how to do the dups and when to exec 

cmd file2 <file3> file1 # same^

답변

3

만큼 나에게 미지 있습니다.

BASH는 왼쪽에서 오른쪽으로 IO 리디렉션을 처리합니다.

> cmd1 > file 2>&1 
> cmd2 2>&1 > file 

이 두 가지는 서로 다릅니다. 첫 번째 경우에는 stdout을 file에 바인딩 한 다음 stderr를 stdout에 바인딩합니다. stderr 및 stdout이 모두 파일로 이동합니다.

두 번째 경우에는 stderr을 stdout (부모)에 바인딩 한 다음 해당 자식의 stdout을 파일로 저장합니다. 결과는 이제 stdout에 자식 stderr 출력을 가져오고 stdout은 파일로갑니다. 예를 들어 파이프의 stderr 처리에 유용합니다.

  • 는 "단어"
  • 에 모든 변수를
  • 분할 입력을 바꾸기 : 당신은 BASH의 소스 코드를 보면

    , 당신은 명령의 실행이 여러 단계로 분할되는 것을 볼 수 있습니다 프로세스 IO 리디렉션 (및 관련 단어 제거)

  • 정확한 IO 설정과 나머지 단어를 인수로 사용하여 새 하위 프로세스를 만듭니다.
+0

는 왼쪽에서 판독 이후 I가 을 티 후 티 실행 입력 세트 FILE3을을 file2 출력에 세트 FILE1을 file1에 출력에 티 설정 티 FILE1> 파일 2 John

+0

아니요. 다시 읽으십시오. 이해가되지 않습니다. "file1을 file2로 출력하도록 설정"할 수 없습니다. 파일은 파일이며 명령이 아닙니다. –

+1

'tee file1> file2

관련 문제