변수에 명령 할당

변수에 명령 할당

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_Filebash는 내부 문자를 일반 문자로 처리합니다. 따라서 우선 |명령줄에는 파이프가 아닌 리터럴 문자가 있습니다.

$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 와 같습니다.

관련 정보