[bash] 쉘에서 한 줄에 여러 명령 실행

내가 파일을 말해봐 /templates/apple내가 원하는

  1. 서로 다른 두 곳에 놓고
  2. 원본을 제거하십시오.

따라서 AND /templates/apple로 복사
한 다음 원본을 제거하고 싶습니다./templates/used/templates/inuse

cp작업을 수행하는 가장 좋은 방법은 rm무엇입니까? 아니면 더 좋은 방법이 있습니까?

나는 한 줄로 모든 것을하고 싶기 때문에 다음과 같이 보일 것이라고 생각합니다.

cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple

이것이 올바른 구문입니까?



답변

|(파이프)를 사용하여 명령 출력을 다른 명령으로 보냅니다. 찾고 &&있는 것은 이전 명령이 성공한 경우에만 다음 명령을 실행하는 연산자입니다.

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple

또는

cp /templates/apple /templates/used && mv /templates/apple /templates/inuse

bash의 명령 연산자 / 구분자를 요약 해보면 다음과 같습니다.

  • |stdout한 명령 의 표준 출력 ( )을 다른 명령의 표준 입력에 파이프 (파이프 라인)합니다 . 참고 stderr계속 될 일이 무엇이든 기본 목적지로 이동합니다.
  • |&양 파이프 stdoutstderr다른 표준에 입력 한 명령. bash 버전 4 이상에서 사용 가능합니다.
  • &&&&이전 명령이 성공한 경우에만 오른쪽 명령을 실행합니다 .
  • ||||이전 명령이 실패한 명령 만 오른쪽 명령을 실행합니다 .
  • ;;이전 명령의 성공 여부에 관계없이 항상 오른쪽 명령을 실행합니다 . set -e이전에 호출 하지 않으면 bash오류로 실패합니다.

답변

cp1 번 위치로 이동 한 다음 mv2 번 위치로 이동 하지 않는 이유 는 원본을 “제거”하는 것입니다.

그리고 아니요, 올바른 구문이 아닙니다. |한 프로그램의 출력을 “파이프”하고 다음 프로그램의 입력으로 전환하는 데 사용됩니다. 원하는 것은 ;여러 명령을 분리하는 것입니다.

cp file1 file2 ; cp file1 file3 ; rm file1

다음 명령을 시작하기 전에 개별 명령이 성공해야하는 경우 &&대신 다음을 사용하십시오 .

cp file1 file2 && cp file1 file3 && rm file1

이렇게하면 두 cp명령 중 하나라도 실패하면 명령이 rm실행되지 않습니다.


답변

참고 cp A B; rm A정확히 mv A B. 실제로 대상을 동일한 파일 시스템에 있다고 가정하고 바이트를 복사 할 필요가 없으므로 파일 이름을 바꾸면 더 빠릅니다. 그래서 너는 원해cp A B; mv A C


답변

다른 옵션은 Ctrl+V Ctrl+J각 명령 끝에 입력 하는 것입니다.

예 (교체 #와 함께 Ctrl+V Ctrl+J) :

$ echo 1#
echo 2#
echo 3

산출:

1
2
3

이전 명령이 실패했는지 여부에 관계없이 명령을 실행합니다.

다음과 같습니다 : echo 1; echo 2; echo 3

실패한 명령에서 실행을 중지 &&하려면 마지막 명령을 제외한 각 행의 끝에 추가하십시오 .

예 (교체 #와 함께 Ctrl+V Ctrl+J) :

$ echo 1 &&#
failed-command &&#
echo 2

산출:

1
failed-command: command not found

에서 zsh당신은 또한 사용할 수 있습니다 Alt+Enter또는 Esc+Enter대신Ctrl+V Ctrl+J


답변

이 시도..

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple


답변

파이프를 사용하는 것이 이상하게 보입니다. 어쨌든 논리 andBash 연산자를 사용해야합니다 .

$ cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apples

cp명령이 실패 하면 명령 rm이 실행되지 않습니다.

또는 for루프 및을 사용하여보다 정교한 명령 줄을 만들 수 있습니다 cmp.


답변