関数がエラーメッセージを印刷できないようです。

関数がエラーメッセージを印刷できないようです。

ディレクトリツリーをより速く返すために、.zshrcファイルにこの小さな関数を作成しました。

#: Move back x director(y/ies).
function bak ()
{
    local x=""
    local limit="$1"
    local msg="Can't move back $limit directories"
    [ -z "$limit" ] && limit=1
    for ((i=0;i<limit;i++)); do
        x="../$x"
    done
    if ! cd "$x"; then
        echo "$msg";
    fi
}

2つの注意事項を除いて、うまく機能します。

  1. 関数が実行され、ディレクトリツリーから再度移動できるときに制限(ルート "/")を超えると、関数はエラーメッセージを出力しません。だから基本的にこの部分は

    if ! cd "$x"; then
        echo "$msg";
    fi
    

    何もしません。

  2. その部分(エラーメッセージを印刷するifステートメント)を削除すると、機能は機能しなくなります。


誰もがエラーメッセージの一部が機能するのを助けることができますか?また、誰かがエラーメッセージの一部を削除すると、機能が中断される理由を説明できると思います。

ベストアンサー1

ほとんどのシステムでは、パスは/..ルートディレクトリと同じファイルを参照します。/これは許可されますが、POSIXでは必須ではありません。:

特殊ファイル名dot-dotは、古いファイルの親ディレクトリを参照する必要があります。特別な場合には、ルートディレクトリのドットポイントはルートディレクトリ自体を参照できます。

/..デフォルトでは、シェル以外のシステムでも呼び出さずに呼び出すと/実行されます。cd-Pcd -L論理的 cd、どこで、いつ$PWD/a/b/c他のディレクトリへのシンボリックリンクがどこにあるか、最も可能性/aが高い)を実行し、たとえばを実行する代わりに実行し、それを実行する場合は、次のようにします(例:/a/b/a/b/ccd ../..chdir("../..")cdchdir("/a")cd ../../../../../../..cdchdir("/")POSIXの要件)。

また、エラーメッセージはstderrに送信する必要があります。

bak() {
    local x limit="${1-1}"
    repeat "$limit" x+=../
    cd "$x" && return
    local ret=$?
    print -u2 "Can't cd back $limit directories"
    return "$ret"
}

エラーメッセージは重複する可能性がありますが、cdエラーメッセージはすでに記録されています。

bak指定された制限がのコンポーネント数より大きい場合、失敗を返すには、$PWD次のようにします。

bak() {
  local depth=0 dir=$PWD x
  repeat "${1-1}" {
    if [[ $dir = / ]]; then
      print -u2 "The current working directory is only $depth level deep"
      return 1
    fi
    dir=$dir:h x+=../
    ((depth++))
  }
  cd "$x"
}

おすすめ記事