![순차적으로 번호가 매겨진 별칭을 반복하는 방법은 무엇입니까?](https://linux55.com/image/112589/%EC%88%9C%EC%B0%A8%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EB%B2%88%ED%98%B8%EA%B0%80%20%EB%A7%A4%EA%B2%A8%EC%A7%84%20%EB%B3%84%EC%B9%AD%EC%9D%84%20%EB%B0%98%EB%B3%B5%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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개의 별칭을 실행하는 목표를 달성합니다.