Ash의 별칭 - 제한 사항, 구문 문제?

Ash의 별칭 - 제한 사항, 구문 문제?

저는 NAS(WD-MBL)에서 OpenWRT를 실행하고 있으며 명령줄을 통해 유지 관리를 더 쉽게 하기 위해 일련의 별칭을 함께 모으고 있습니다.

예상대로 작동합니다.

alias shutdown='sync && wait && sudo hdparm -Y /dev/sda && wait && sudo halt'

NAS를 정상적으로 종료합니다.

daemon='sudo /etc/init.d/rsyncd status'

rsync데몬의 상태를 알려주세요 .

drivechk='sudo dmesg | grep -i ext4-fs | grep -i sda'

잘못된 종료로 인한 파일 시스템 문제에 대해 경고합니다 e2fsck. 필수 .

tempchk='sudo smartctl -d ata -A /dev/sda | grep Temperature | cut -c 5-8,87-89'

드라이브 온도를 알려주세요.

하지만 제가 일할 수 없는 것이 하나 있습니다:

fschk='df -h | grep -vE '^Filesystem|/dev/root|tmpfs'| awk '{ print $5 " " $1}'

명령줄에서 스탠자를 실행하면 예상대로 작동합니다.

~$ df -h | grep -vE '^Filesystem|/dev/root|tmpfs'| awk '{ print $5 " " $1}'
53% /dev/sda1
37% /dev/sda3
~$

이것을 파일에 추가하고 /etc/profile.d/custom.sh로그아웃했다가 다시 로그인하면 터미널에 다음이 표시됩니다.

~$ ssh [email protected]
--- snip ---
BusyBox v1.33.2 (2022-02-16 20:29:10 UTC) built-in shell (ash)

alias:  }' not found

~$ 

그런 다음 별칭을 실행하면 다음과 같은 결과를 얻습니다.

~$ fschk
> 

명령줄에서 목록을 쿼리 하면 alias추가한 목록이 인쇄물에 다르게 나타나는 것을 볼 수 있습니다.

~$ alias
--- snip ---
fschk='df -h|grep -vE '"'"'^/dev/root|tmpfs'"'"'|awk '"'"'{print  '
--- snip ---
:~$ 

하지만 내 입력 파일에는 없습니다.

~$ cat /etc/profile.d/custom.sh
--- snip ---
alias fschk="df -h|grep -vE '^/dev/root|tmpfs'|awk '{print $5 " " $1}'"
--- snip ---
~$ 

ash다른/단순화된 버전이 있는 것 같지만 alias알아낼 수 없습니다.

어떤 조언이라도 대단히 감사하겠습니다.

미리 감사드립니다.

최고,

폴리카프로락톤

답변1

당신의 별칭,

alias fschk="df -h|grep -vE '^/dev/root|tmpfs'|awk '{print $5 " " $1}'"

큰따옴표로 묶인 문자열입니다. 따라서 쉘은 별칭을 정의할 때 문자열의 합계를 확장합니다 $5. $1이를 방지하려면 달러 기호를 피하십시오.

별칭에는 큰따옴표도 포함되어 있으며, 문자열이 깨지지 않도록 하려면 이스케이프해야 합니다.

alias fschk="df -h | grep -vE '^/dev/root|tmpfs' | awk '{ print \$5 \" \" \$1}'"

또는 단순화하려면 다음을 수행하십시오.

alias fschk="df -h | awk '!/^\/dev/root|tmpfs/ { print \$5, \$1 }'"

또는 쉘 함수로(이 경우 인용에 전혀 문제가 없습니다):

fschk () {
    df -h | awk '!/^\/dev/root|tmpfs/ { print $5, $1 }'
}

df또는 다음 정보 가 추출되지 않도록 파일 시스템 목록을 허용하는 기능으로 :

fschk () {
    df -h | (
        IFS='|'
        pat="${*:+^($*)}" awk 'ENVIRON["pat"] == "" || $0 !~ ENVIRON["pat"] { print $5, $1 }'
    )
}

이렇게 사용하시면 될 것 같아요

fschk tmpfs /dev/root

실제로 모든 별칭을 셸 함수로 다시 작성하는 것이 좋습니다. 별칭은 사소한 일에만 유용합니다.

관련 정보