Red Hat Linux Enterprise 버전 5를 사용하고 &
있습니다. 사람들이 때때로 몇 가지 옵션으로 명령을 실행하는 것을 보았습니다 . 예를 들어 아래 명령에는 두 개의 &
부호가 있습니다. 그들의 목적은 무엇입니까? 그들은 항상 nohup과 함께 사용됩니까?
nohup foo.sh <script parameters> >& <log_file_name> &
답변
Martin ‘s, Ash 및 Kevin의 답변 외에도 때로는 앰퍼샌드가 수학적으로 비트 단위 AND *로 사용되는 것을 볼 수 있습니다 .
$ echo $(( 11 & 7 ))
3
비트 연산자에 익숙하지 않은 경우 :
11: 1011
7: 0111
-------- AND
3: 0011
각 위치에는 첫 번째 숫자와 두 번째 숫자에 1 비트가 있으며 답에서 해당 비트를 1로 설정하십시오.
* Kevin의 답변에서이 기능을 논리 AND 라고합니다 .
Ash의 답변을 자세히 설명하기 위해 리디렉션에서 사용될 때 앰퍼샌드는 셸에 파일 설명자를 복사하도록 지시 할 수 있습니다. 이 명령 echo "hello" > outputfile 2>&1
에서 앰퍼샌드는 표준 오류 (stderr, 파일 설명자 2)로 갈 수있는 모든 출력이 표준 출력 (stdout, 파일 설명자 1, 왼쪽의 기본값)과 같은 위치로 이동합니다 >
. >& outputfile
연산자에 대한 속기 > outputfile 2>&1
.
또한 Bash 4의 새로운 기능으로, case
명령 에 절에 대한 두 개의 새로운 종결자가 있으며 ;&
, ;;&
이는 사례가 “통과”하는지 여부에 영향을 미치며, 그렇다면 다음 테스트 수행 여부에 영향을줍니다.
답변
Bash 셸 스크립트에서 앰퍼샌드 “&”는 프로세스를 분기하는 데 사용됩니다.
find -name hello &
find 명령이 포크되어 백그라운드에서 실행됩니다 (PID로 언제든지 종료 할 수 있음).
답변
왜 ‘&’로 Linux 쉘 명령을 실행합니까?
프롬프트를 즉시 되돌리고 백그라운드에서 프로세스를 실행하십시오.
그들의 기능은 무엇입니까?
nohup 은 사용자가 로그 아웃 한 후에도 (또는 시작 쉘을 종료 한 후에도) 백그라운드 프로세스가 계속 실행되도록합니다.
> & 는 표준 출력과 표준 오류를 모두 로그 파일로 리디렉션합니다.
& 백그라운드에서 모든 것을 실행하여 즉시 프롬프트를 표시합니다.
설명:
모든 Linux 프로세스는 세 개의 I / O 채널, 입력 “stdin”, 표준 출력 “stdout”및 표준 오류 출력 “stderr”을 엽니 다. 바이너리로 사용될 수 있지만 전통적으로 텍스트입니다. 대부분의 프로그램이 stdin close를 보이면 종료합니다 (프로그래머가 변경할 수 있음).
부모 껍질이 나오면 stdin이 자식에서 닫히고 종종 자식도 종료됩니다. 또한, 아이들은 SIGHUP이라는 소프트웨어 신호를 수신하는데, 이는 사용자가 “전화를 끊었다”(이전의 모뎀) 고 여기서 기본값은 종료하는 것입니다. (프로그래머는 프로그램을 작성할 때이 모든 것을 변경할 수 있습니다).
따라서 nohup은 자식 프로세스에 별도의 I / O 환경을 제공하여 부모 쉘에 묶이지 않은 것에 인과 아웃을 묶고 SIGHUP 신호로부터 자식을 보호합니다. 사용자가 연결을 끊으면 사용자의 쉘이 아닌 init가 소유 한 nohup 백그라운드 프로세스 (프로세스 1)가 표시됩니다.
그러나 nohup
프로세스가 포 그라운드에서 실행되는 경우 작업을 완전히 수행 할 수 없으므로 백그라운드 &
에서 프로그램을 실행하는 데 사용되며, 사용자가 로그인하거나 로그인하지 않아도 행복하게 실행할 수 있습니다.
답변
뿐만 아니라 마틴의 대답 @ : 앰퍼샌드의 다른 용도로 사용 ( >&
위)을 모두 캡처하는 것입니다 stdout
및 stderr
. 일반적으로 출력을 ‘>’만있는 파일로 경로 재 지정 stdout
하면 오류가없는 출력 만 표시됩니다 .
답변
Martin과 Ash의 답변 외에도 때때로 &&
토큰 사용이 표시 될 수 있습니다 . “첫 번째 명령이 성공적으로 실행 된 경우에만 두 번째 명령을 실행하십시오”라고 말하는 데 사용됩니다. 잘 작성된 명령은 오류가 있으면 성공적으로 종료되지 않습니다.
[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$
답변
마틴의 대답은 좋지만 약간 모호합니다. 명령은 항상 포크되고 실행되지만 일반적인 쉘 동작은 명령이 종료 될 때까지 명령을 기다리는 것입니다. 앰퍼샌드가 백그라운드로 입력되어 터미널 프롬프트가 다시 표시되고 다른 작업을 수행 할 수 있습니다. 프로세스가 데이터를 stdout 또는 stderr에 뱉어 내면 프롬프트에서 수행하는 작업과 혼합되어 혼동 될 수 있습니다. 이것이> & /path/to/logfile.txt로 경로를 재지 정하는 이유입니다.
George2에 대한 응답으로 쉘 종료에 대한 일반적인 동작은 SIGHUP 신호를 동일한 프로세스 그룹 (본질적으로 생성 한 것)의 모든 프로세스에 전송하는 것이며 일반적으로 종료됩니다. 쉘 프로세스를 닫아도이 작업을 계속하려면 nohup 명령을 사용하여이 신호를 무시하고 계속 실행하십시오. 이러한 유형의 프로세스에는 특별한 이름이 있는데,이를 데몬 프로세스 ( ‘데몬’이라고 함)라고합니다.