bash 함수에 전달하기 전에 bash 별칭을 어떻게 평가합니까?

bash 함수에 전달하기 전에 bash 별칭을 어떻게 평가합니까?

테스트 별칭을 다음과 같이 정의했습니다.

alias testalias='python3 -c "f = open(\"/tmp/testopenfile\", \"w+\"); f.write(\"hi\n\")"'

터미널을 통해 직접 실행하면 제대로 작동합니다. /tmp/testopenfile을 잘 처리할 수 있습니다. 또한 오류와 프로그램 출력을 배경으로 하고 침묵시키는 도우미 함수도 정의했습니다. 나는 이 함수를 오랜 시간이 걸리거나 while 루프에 있는 일부 별칭과 함께 사용하고 싶습니다(단순한 예가 아님). 이는 다음과 같이 정의됩니다:

detach is a function
detach ()
{
    $1 > /dev/null 2> /dev/null &
}

저는 bash를 사용하고 있으며 이 두 가지를 결합하려고 합니다. 시도해 보니 detach testalias작동하지 않는 것 같습니다(/tmp/testopenfile이 생성되지 않는 것 같습니다). testalias가 평가되지 않고 직접 전달되는 것처럼 보입니다. 합격하기 전에 이 평가를 수행하기 위한 팁은 무엇입니까?

또한 이 코드는 파일을 생성합니다.

python3 -c "f = open(\"/tmp/testopenfile\", \"w+\"); f.write(\"hi\n\")" 1>/dev/null 2>/dev/null &

답변1

별칭을 함수로 바꿉니다.

testalias() {
    python3 -c 'f = open("/tmp/testopenfile", "w+"); f.write("hi\n")'
}
detach ()
{
    "$@" > /dev/null 2> /dev/null &
}

Bash는 별칭 확장을 위해 명령의 첫 번째 단어만 살펴보므로 이 함수는 리터럴 인수를 사용합니다 testalias. (zsh에는 명령줄 어디에서나 확장할 수 있는 "전역" 별칭이 있다고 생각하지만 echo testalias별칭 내용을 확장 하고 싶은지는 의문입니다 .)

별칭 확장도 확장 전 파싱 프로세스 초기에 발생하므로 $1함수가 실행될 때 $1확장이 동일 testalias하고 변경되지 않은 상태로 유지됩니다. 명령을 찾을 수 없다는 오류가 발생할 수 있습니다 testalias. 단, stderr이 리디렉션되어 /dev/null오류가 표시되지 않습니다.

실제로 함수가 호출되면 함수 내의 별칭이 확장됩니다.에프, 사용할 때보다.

$ alias foo="echo abc"
$ f() { foo; }
$ alias foo="echo def"
$ g() { foo; }
$ f
abc
$ g
def

testalias기능 의 경우 testalias명령어를 검색하면 발견됩니다.

관련 정보