배쉬 : 변수에 별칭 사용


9

각 인수를 명령으로 실행하는 bash 스크립트를 작성 중입니다. 이것은 내 명령에는 작동 PATH하지만 별칭에는 적용되지 않습니다. 스크립트에서 별칭을 직접 호출 할 수 있지만 인수로 전달 된 별칭을 호출 할 수 없습니다.

문제는 필자가 변수보다 별칭을 확장한다는 것입니다. 변수에서 별칭을 실행하는 방법이 있습니까?

샘플 스크립트 :

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"작동하지만, runall "myalias"제공runall: line 8: myalias: command not found

답변:


9

몇 가지 테스트 후 다음을 결론지었습니다.

  • 별명은 대화식 모드에서만 작동합니다 ( -ishebang에 추가 ).
  • 해석 된 소스 (이 경우 변수)에서 별명이 평가되지 않습니다.
  • bash가와 함께 별칭을 사용하도록 할 수 있습니다 eval $1. 참고 eval변수로 만든 아무것도 보내고 것은 위험하지만, 스크립트의 요점은 임의의 실행을 필요로하기 때문에, 내가 그 밖으로 너무 큰 거래를하지 않습니다.

bash 매뉴얼 페이지에서 :

expand_aliases 쉘 옵션이 shopt를 사용하여 설정되지 않는 한 쉘이 대화식이 아닌 경우 별명은 확장되지 않습니다 (아래 SHELL BUILTIN COMMANDS에서 shopt에 대한 설명 참조).

그래서 shopt -s expand_aliases대신에 추가 할 수 있습니다 -i.

또한,

명령이 실행될 때가 아니라 명령을 읽을 때 별칭이 확장됩니다.

명령을 읽기 전에 변수가 확장되지 않으므로 별명을 사용하여 추가로 확장되지 않습니다.


1
알고 반갑습니다. 호기심에서 벗어나는 이유는 eval무엇입니까?

1
@hesse 고려하십시오 eval "echo $1". 내가 전화를 말한다 ./script.sh "hello;rm -rf ~. 무엇이 실행됩니까? echo hello, 뒤에 rm -rf ~. 분명히 이것은 좋은 예이지만 원칙이 적용됩니다.
케빈

내가 이미 가지고 있기 때문에 일 eval앞에 추가 $1했습니다 shopt -s expand_aliases. 감사!
Jayson

1

이 사이트에 설명 된 것처럼 비슷한 문제가 있었고 별칭을 함수로 설정하여 문제를 해결할 수있었습니다 .

예 :

alias lsd="ls -lash"

function lsd() { ls -lash; }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.