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'

ドライブ温度を教えてください。

しかし、私が働くことができないものが1つあります:

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

実際には、すべてのエイリアスをシェル関数として書き換えることをお勧めします。エイリアスはマイナーな仕事にのみ便利です。

関連情報