변수에 저장된 잘라내기 명령이 작동하지 않습니다.

변수에 저장된 잘라내기 명령이 작동하지 않습니다.

컷 명령을 변수에 저장할 수 없는 이유를 누군가 설명해 줄 수 있나요?

user:~$ echo "foo bii doo" | cut -d ' ' -f 2
bii # as expected
# now put cut command into a variable:
user:~$ c="cut -d ' ' -f 2"
user:~$ echo "foo bii doo" | $c
cut: "'": No such file or directory
user:~$ c="cut -d \  -f 2"
user:~$ echo "foo bii doo" | $c
foo bii doo

tr이 유효하므로 이는 일반적인 인용 문제가 아닙니다.

user:~$ t="tr -d 'oo'"
user:~$ echo "foo bii doo" | $t
f bii d

(저는 Debian 12에서 bash를 사용하고 있습니다.)
이 문제는 다른 방법으로 해결되었습니다. 왜 디버깅 시간을 3시간이나 낭비했는지 알고 싶습니다 :)

답변1

어떻게 보면 이는 인용의 문제가 아니라 확장의 문제입니다. 변수 확장은 텍스트 대체가 아니며 변수에서 얻은 데이터는 다음과 같습니다.아니요코드로 구문 분석합니다. 이는 따옴표, 백슬래시 이스케이프 또는 기타 셸 구문이 처리되지 않음을 의미합니다. 대신 확장된 값은 공백(모든 공백)으로 토큰화됩니다. 이는 토큰화를 사용하여 하나의 문자열에 여러 개의 임의 문자열을 저장할 수 없음을 의미합니다.

tr당신이 사용한 명령~인 것 같다인수에 작은따옴표를 추가해도 os에 대한 작업이 변경되지 않기 때문에 작동합니다. Chris Davis가 의견에서 언급했듯이 이렇게 하면:

$ t="tr -d 'oo'"
$ echo "don't forget" | $t
dnt frget

tr제거할 문자 목록에 따옴표가 포함되어 있는 것을 확인할 수 있습니다. 인수 가 아니라 인수가 tr있습니다 . 공백을 제거 하려면 다음과 같은 문제가 발생합니다 .'oo'ootrcut

$ t="tr -d ' '"
$ echo "don't forget" | $t
usage: tr [-Ccsu] string1 string2
       tr [-Ccu] -d string1
       tr [-Ccu] -s string1
       tr [-Ccu] -ds string1 string2

, 및 tr3개의 인수를 사용하여 실행을 시도하는데 , 이는 사용 방법과 일치하지 않으므로 사용법 도움말을 인쇄합니다.-d''

이를 수행하는 방법은 다음과 같은 함수를 작성하는 것입니다.

c() {
    cut -d \  -f 2
}
echo "foo bii doo" | c

주다 bii.

바라보다:

관련 정보