CDを関数にローカルに作成できますか?

CDを関数にローカルに作成できますか?

同様の機能を作成できますか?

function doStuffAt {
    cd $1
    # do stuff
}

しかし、関数を呼び出すと、実際に私のパスワードが変更されるわけではなく、関数が持続している間だけ変更されるという意味ですか?私はパスワードを保存して最後にリセットできることを知っていますが、それを心配することなくローカルでパスワードを設定する方法があることを望みました。

ベストアンサー1

はい。グループコマンド( )の代わりにサブシェルで関数にコマンドを実行させます。{ }

doStuffAt() (
        cd -- "$1" || exit # the subshell if cd failed.
        # do stuff
)

角括弧(( ))は、親シェルの環境を継承する新しいサブシェルを開きます。サブシェルを実行するコマンドが完了すると、シャットダウンして親シェルに戻り、サブシェルcdにのみ影響するため、PWD は変更されません。

サブシェルはすべてのシェル変数もコピーするため、グローバル変数を介してサブシェル関数の情報をデフォルトのスクリプトに戻すことはできません。

サブシェルの詳細については、以下を確認してくださいman bash

(リスト)

listはサブシェル環境で実行されます(以下のコマンド実行環境を参照)。シェル環境に影響を与える変数割り当ておよび組み込みコマンドは、コマンドの完了後に無効になります。戻り状態はリストの終了状態です。

比較:

{リスト; }

listは現在のシェル環境でのみ実行されます。リストは改行またはセミコロンで終わる必要があります。これをグループコマンドと呼びます。戻り状態はリストの終了状態です。メタ文字(および)とは異なり、{と}は予約語であるため、予約語を認識できる場所に表示する必要があります。単語の分離を引き起こさないので、スペースやその他のシェルメタ文字でリストと区別する必要があります。

おすすめ記事