ls
내 변수에 명령을 할당했지만 my_File
실행하면 $my_File
작동하지 않습니다. 이유를 설명해 주실 수 있나요?
#!/bin/bash
my_File='ls -f | grep -v '\/''
$my_File
답변1
작성한 줄은 값이 string 인 변수를 정의합니다 ls -f | grep -v /
. 따옴표 없이 사용하면 단어 목록(공백으로 구분된 문자열): ls
, -f
, |
, grep
, -v
, 으로 확장됩니다 /
. 이 |
문자는 쉘이 문자열을 구문 분석하는 대신 분할하기 때문에 특별하지 않으므로 명령에 대한 두 번째 인수가 됩니다 ls
.
이러한 문자열에는 명령을 채울 수 없습니다. 명령에 대한 짧은 이름을 정의하려면 별칭(명령이 완료된 경우) 또는 함수(명령에 매개 변수가 있고 일부 기본 매개 변수를 단일 명령에 전달하는 것이 아닌 경우)를 사용합니다. 귀하의 경우 별칭이 적합합니다.
alias my_File='ls -f | grep -v /'
my_File
답변2
$ my_File='ls -f | grep -v '\/''
$ $my_File
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
[snip]
해석할 때 $my_File
bash는 내부 문자를 일반 문자로 처리합니다. 따라서 우선 |
명령줄에는 파이프가 아닌 리터럴 문자가 있습니다.
$my_File
명령줄에서 실행하고 파이프라인이 작동하도록 하려는 경우에 필요합니다 eval $my_File
.
답변3
echo "${var='ls -f | grep -v "\/"'}" |sh
반드시 통역사가 필요하지는 않지만 반드시 통역사가 필요합니다.eval
.
. <<-HEREDOC /dev/stdin
$var
HEREDOC
echo "$var" | . /dev/stdin
거기에 가는 방법은 여러 가지가 있습니다.
${0#-} -c "$var"
sh - c "$var"
답변4
변수=command
백틱 문자(`)
var = pwd
echo $var = /home/user/foo 와 같습니다.