-c를 통해 bash에 전달하면 스크립트가 작동하지 않습니다.

-c를 통해 bash에 전달하면 스크립트가 작동하지 않습니다.

이것이 작동하는 이유:

$ cat test.sh
#!/bin/bash
cat <(date|awk '{print $1}')

$ ./test.sh
Thu

하지만 bash에 전달된 명령은 아닙니다.

$ bash -c "cat <(date|awk '{print $1}')"
Thu  2 Apr 2020 12:52:10 BST

저는 이것을 macOS에서 실행하고 있습니다

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.

답변1

한 줄짜리에서는 $1큰따옴표로 묶인 문자열 안에 있습니다.

"cat <(date|awk '{print $1}')"

이는 대화형 셸에 의해 확장된다는 의미입니다. 첫 번째 위치 매개변수 $1인 가 비어 있으면 이를 빈 문자열로 확장하여 awk입력만 인쇄하는 프로그램이 됩니다.

awk '{print }'

쉘이 확장을 시도하는 것을 막기 위해 in $을 탈출하십시오 . 그러면 완전한 명령은 다음과 같습니다.$1\$1

bash -c "cat <(date|awk '{print \$1}')"

스크립트 변형에서 는 $1작은따옴표로 묶인 문자열입니다. 따라서 쉘은 이를 확장하려고 시도하지 않습니다.

하지만 이 특정한 경우에는 그냥 사용하는 것이 좋습니다.

date +%a

요일의 약칭을 인쇄합니다. strftime(3)설명서( ) 도 참조하세요 man 3 strftime.

최신 bash버전(릴리스 4.2+, 즉기본 bashmacOS에서는 예를 들어 설치된 것이 있습니다.홈브류),

printf '%(%a)T\n' -1

외부 명령을 호출하지 않고도 동일한 작업을 수행합니다.

관련 정보