私はこのスクリプトを作成しました:
#!/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 0
bash
$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
示すオプションを使用することもできます。だから:mkdir
mkdir
mkdir -p -- "$1" &&
sleep 0.5
寝る必要はありません。成功した戻り値は、ディレクトリが作成されたことを確認することですmkdir
。
cd $1
-
もう一度申し上げますが、引用文と質問があります。また、次のような他のユーティリティで使用するように選択するbash
必要があります。-P
cd
mkdir
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
答え2
機能はどうですか?
crdir() { mkdir $1; cd $1; }