function isaix { echo "alias d='du -sm -- * 2>/dev/null | sort -nr | head -20'" >> ~/.kshrc; }
function islinux { echo "alias d='du -sm -- * 2>/dev/null | sort -nr | head -20'" >> ~/.bash_profile; }
OSTYPE="`uname`"; if echo "${OSTYPE}" | grep -iq aix; then isaix; fi; if echo "${OSTYPE}" | grep -iq linux; then islinux; fi
前の行は、最初の20個のファイルとディレクトリをサイズ別にリストする「d」エイリアスを作成します。
質問:この長い行をどのように短くすることができますか? (OSタイプ検知など)
答え1
OSTYPE="`uname`"
OSTYPE="${OSTYPE,,}"
case "$OSTYPE" in
*aix*)
target=~/.kshrc
;;
*linux*)
target=~/.bash_profile
;;
esac
if [ -n "$target" ]; then
echo "alias d='du -sm -- * 2>/dev/null | sort -nr | head -20'" >> "$target"
fi
答え2
$(...)
出力ファイル名を切り替えるには、シェルのコマンド拡張を使用します。
このコードはaixのみをチェックします。デフォルトの動作が更新されました.bashrc
。
echo "alias d='du -sm -- * 2>/dev/null | sort -nr | head -20'" >> $( case $(uname) in *[aA][iI][xX]*) echo ~/.kshrc;; *) echo ~/.bashrc;; esac )
または、読みやすくするために行を分割します。
rcfile=$( case $(uname) in *[aA][iI][xX]*) echo ~/.kshrc;; *) echo ~/.bashrc;; esac )
echo "alias d='du -sm -- * 2>/dev/null | sort -nr | head -20'" >> $rcfile
答え3
よりコンパクトなバージョン(kshとbashで有効)は次のとおりです。
typeset -l ostype
ostype="$(uname)";
cmd="alias d='du -sm -- * 2>/dev/null |sort -nr |head -n 20'"
case "$ostype" in
*aix*) echo "$cmd" >> ~/.kshrc; ;;
*linux*) echo "$cmd" >> ~/.bash_profile; ;;
esac
答え4
短い答えですが、もう少し秘密です(bashとkshの両方で動作します)。
typeset -l ostype; ostype="$(uname)"
cmd="alias d='du -sm -- * 2>/dev/null | sort -nr | head -20'"
case $ostype in
*linux*) a=ba;;
*aix*) a=k;;
esac
a="${a:+~/".${a}shrc"}"
${a:+false} || echo "$cmd" >> "$a"