新しいものをどのようにオーバーライドまたは定義しますか?条件式基本色バッシュから?たとえば、空のディレクトリが存在するかどうかをテストするためにマスターデータベースが必要です。もちろん、1つの基本オプションのみを使用してこれを行うのが最善ですが、これが不可能な場合は、2つの基本オプションを使用できます。たとえば、私は次の目標を達成したいと思います。
if [ -DZ $HOME/dir ]; # true if directory the path is an empty directory
then echo "$HOME/dir doesn't have any non-hidden files or directories!"
fi
答え1
独自の述語を追加するには、組み込みコマンドのソースをtest
変更する必要があります。移植できないスクリプトが生成されるので、これはおそらくあなたが望むものではないでしょう。代わりにシェル関数を使用できます。bash
[
isemptydir () (
shopt -s nullglob
shopt -s dotglob
if [ -z "$1" ]; then
echo 'isemptydir: Empty or missing argument' >&2
return 1
# could instead do: set .
# this would use the current directory as the "default" one
fi
if [ -d "$1" ]; then
# note: above test fails on inaccessible dirs --> "not empty"
set -- "${1%/}"/*
[ "$#" -eq 0 ]
# note: above test succeeds on unlistable dirs --> "empty"
fi
)
if isemptydir "$mydir"; then
printf 'Directory "%s" is empty\n' "$mydir"
else
printf '"%s" is not a directory, or is not empty\n' "$mydir"
fi
この関数は、与えられた引数がディレクトリ名かどうかをテストします。その場合は、隠された名前を含むディレクトリで使用可能な名前(ファイルだけでなく)の数を数え、0と比較します。最後に実行されたテストの戻り状態は関数の戻り状態です。
[
独自の関数オーバーロードやコマンドを使用できますが、test
これによって問題が発生する可能性があります。