순차적으로 번호가 매겨진 별칭을 어떻게 순환합니까?

순차적으로 번호가 매겨진 별칭을 어떻게 순환합니까?

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

사물의 평가 순서로 인해 문자열 (for ) echo$i로 평가됩니다 .echo1i=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개의 별칭을 실행하는 목표를 달성할 수 있습니다.

관련 정보