bashスクリプトサブシェルの外部でcdコマンドが機能するようにするにはどうすればよいですか? [コピー]

bashスクリプトサブシェルの外部でcdコマンドが機能するようにするにはどうすればよいですか? [コピー]

私はこのスクリプトを作成しました:

#!/bin/bash

if [[ $# -ne 1 ]]; then
  echo "only use one argument"
  exit 1
fi

mkdir $1
sleep 0.5
cd $1

exit 0

crdir asd後で/ usr / binに入れてスクリプトを作成するたびに、ディレクトリが作成され、現在のディレクトリが新しいディレクトリに自動的に変更されるようにスクリプトを作成したいと思います。

schelスクリプトは明らかにサブシェルであり、cdコマンドはサブシェルの外部では適用されないため、この方法は機能しません。では、どうすればよいですか?

私はそれを「取得しなければならない」と前にあるポイントを実行しなければならないとオンラインで読んだ. ./crdir asd。コマンド。

どのようなヒントがありますか?

編集:私も試しましたが、前のコマンドの引数としてmkdir aaa; cd !#機能しませんでした。!#

ベストアンサー1

関数として作成します。

crdir() {
  if [ "$#" -eq 1 ]; then
    mkdir -p -- "$1" && cd -P -- "$1"
  else
    echo >&2 "Usage: crdir <directory-path>"
    return 1
  fi
}

これを~/.bashrc

あなたの方法は(引数を受け取ることができるシェル. crdirでも)動作しますが、シェルを終了する方法を削除する必要があります。また、POSIXモードでない場合は、現在のディレクトリで探しているファイルが見つからないと少し危険になります(最後にエントリを追加または空にするのと同じレベル)。bash.exit 0bash$PATH.$PATH

また、. crdir引数なしで呼び出されると、スクリプトはシェルの位置引数を継承します。たとえば、set foo; . crdirエラーは返されず、ディレクトリfooが作成されます。

スクリプトに関するいくつかの追加注意事項:

#!/bin/bash

ファイルをインポートすると、she-bangは無視されます(コメントとしてのみ処理されます)。

if [[ $# -ne 1 ]]; then
  echo "only use one argument"

stderr() にecho >&2 textエラーメッセージを出力する方が良いでしょう。

  exit 1
fi

mkdir $1

引用符のないパラメータ拡張は で特別な意味を持ちbash、これをほとんど実行してはいけません。

また$1、で始まる場合は-オプションとして扱われますmkdir。 optionで始まってもオプションではないことを--知らせるには、option閉じるタグを使用する必要があります。mkdir$1-

mkdirまた、コマンドが成功したことを確認していません。

すべてのディレクトリコンポーネントが作成され、ディレクトリがすでに存在する場合は失敗が返されないことを-p示すオプションを使用することもできます。だから:mkdirmkdir

 mkdir -p -- "$1" &&
sleep 0.5

寝る必要はありません。成功した戻り値は、ディレクトリが作成されたことを確認することですmkdir

cd $1

-もう一度申し上げますが、引用文と質問があります。また、次のような他のユーティリティで使用するように選択するbash必要があります。-Pcdmkdir

 cd -P -- "$1"

(今は-orというパスを無視してください$CDPATH。orは使用せず、通常の値のみを使用してください。)

exit 0

また終了状態を確認せずにcd戻りました。成功終了状態(偶数mkdirまたはcd失敗)。スクリプトをインポートするとソースシェルから解釈されるため、スクリプトexitは終了します。

ここでは、スクリプトを次のように書き直します。

if [ "$#" -eq 1 ]; then
  mkdir -p -- "$1" && cd -P -- "$1"
else
  ! echo >&2 "Usage: crdir  <directory-path>"
fi

おすすめ記事