Bash에서 인수를 사용하여 명령 실행

Bash에서 인수를 사용하여 명령 실행

다음과 같은 bash 스크립트가 있습니다.

#!bin/bash

# array to store my commands
COMMANDS=(route
ls -l
)

# here I want to iterate through the array, run all the commands and take
# screenshot of each after their execution to be put into my lab assignment file.
for (( i=0; i<${#COMMANDS[@]}; i=i+1 )); do
    clear
    "${COMMANDS[$i]}"
    gnome-screenshot -w -f "$i".png
done

그러나 출력은 다음과 같습니다.

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    600    0        0 wlx00e02d4a265d
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 docker0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.43.0    0.0.0.0         255.255.255.0   U     600    0        0 wlx00e02d4a265d

5.png  Downloads       my_rust_projects  sys-info
6.png  FINAL450.pdf    Pictures          Templates

-l: command not found

ls -l각 파일에 대한 세부 항목의 원하는 결과를 어떻게 얻을 수 있습니까 ?

답변1

바라보다http://mywiki.wooledge.org/BashFAQ/050, "명령어를 변수에 넣으려고 하는데 복잡한 경우가 항상 실패해요!"

생각보다 더 복잡합니다. 각 명령은 별도의 배열에 배치되어야 합니다. Bash는 다차원 배열을 구현하지 않으므로 이를 관리해야 합니다.

이 시도:

CMD_date=( date "+%a %b %d %Y %T" )
CMD_ls=( ls -l )
CMD_sh=( env MyVar="this is a variable" sh -c 'echo "$MyVar"' )
commands=( date ls sh )

for cmd in "${commands[@]}"; do
  declare -n c="CMD_$cmd"   # set a nameref to the array
  "${c[@]}"              # and execute it
done

namerefs는 bash 4.3에 도입되었습니다. bash가 오래된 경우에도 간접 변수를 사용하여 작동합니다.

for cmd in "${commands[@]}"; do
  printf -v tmp 'CMD_%s[@]' "$cmd"
  "${!tmp}"    # and execute it
done

더 나은 방법: 함수를 사용하세요.

CMD_date() {
  date "+%a %b %d %Y %T"
}
CMD_ls() {
  ls -l
}
CMD_sh() {
  env MyVar="this is a variable" sh -c 'echo "$MyVar"'
}
commands=( date ls sh )

for cmd in "${commands[@]}"; do
  "CMD_$cmd"
done

답변2

해결책을 찾았지만 그것이 좋은 생각인지 나쁜 생각인지 모르겠습니다. 어떤 제안이라도 높이 평가하겠습니다.

for (( i=0; i<${#COMMANDS[@]}; i=i+1 )); do
    clear

    # added bash -c in front.
    bash -c "${COMMANDS[$i]}"
    gnome-screenshot -w -f "$i".png
done

관련 정보