순차적으로 번호가 매겨진 별칭을 반복하는 방법은 무엇입니까?

순차적으로 번호가 매겨진 별칭을 반복하는 방법은 무엇입니까?

3개의 별칭이 있습니다. 이름은 echo1, echo2, echo3입니다.

더 큰 명령의 일부로 이 세 가지 명령을 어떻게 실행할 수 있나요?

$ alias echo1='echo 1'
$ alias echo2='echo 2'
$ alias echo3='echo 3'

$ echo1
1

$ echo2
2

$ echo3
3

$ echo{1..3}
bash: echo1: command not found

$ bash -ic echo{1..3}
echo2: echo1: command not found

$ bash -ic 'echo{1..3}'
bash: echo1: command not found

해결책: Kusalananda의 답변을 바탕으로 합니다.

 printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"

답변1

평가되는 순서로 인해 echo$i문자열로 평가됩니다 echo1(for i=1).뒤쪽에별칭 확장.

해당 문자열을 별칭으로 사용하려면 결과 문자열을 다시 평가해야 합니다.

for i in 1 2 3; do
    eval "echo$i"
done

만약 echo1, echo2그리고 echo3있었다쉘 기능, 그러면 eval필요하지 않습니다(Bash 4.4에서 테스트됨).

bash -c별칭이 현재 셸 세션에 로컬이므로 시도가 작동하지 않습니다.

당신의 첫 번째 일은

echo{1..3}

이어질 것이다

echo1 echo2 echo3

echo1결과는 다음과 같이 확장 되더라도 echo 1문자열의 출력입니다.

1 echo2 echo3

개인적으로 별칭을 원하는 대상에 따라 다릅니다.실제로이렇게 하면 다음과 같은 기능을 구현하게 됩니다.

dothing () {
    printf '%s\n' "$@"
}

...그런 다음 사용하세요

dothing {1..3}

생산

1
2
3

물론 이것은 직접적으로 달성될 수 있습니다 printf '%s\n' {1..3}...

답변2

별칭을 수행하는 다른 함수를 만들어 보는 것은 어떨까요?

function execute_all_aliases{
  alias1
  alias2
  alias3
}

답변3

언제든지 다음과 같이 할 수 있습니다.

eval echo{1..3}\;

즉, 쉘 코드의 확장을 평가하도록 쉘에 지시합니다. 즉, 다음을 평가합니다.

echo1; echo2; echo3;

다른 변형:

eval echo{1..3}$'\n' # separate with newline instead of ;. Can make a
                     # difference for things like alias echo1='echo x|'
                     # alias echo2='tr x y'

eval echo{1..3}'&&' : # only run the next one if the previous one succeeded

답변4

@Kusalananda 덕분에 다음과 같은 해결책을 생각해냈습니다.

printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"

이는 다른 명령 부분과 함께 순차적으로 명명된 n개의 별칭을 실행하는 목표를 달성합니다.

관련 정보