ディレクトリを引数としてコマンドを実行し、同じディレクトリにcdするにはどうすればよいですか? 「該当するファイルやディレクトリがありません」というメッセージが表示されます。

ディレクトリを引数としてコマンドを実行し、同じディレクトリにcdするにはどうすればよいですか? 「該当するファイルやディレクトリがありません」というメッセージが表示されます。

次のように短い関数を作成したいと思います。 「file.tex」ファイルを私のドキュメントディレクトリに移動するとしましょう。

mv file.tex ~/Documents

cdその後、そのディレクトリに移動したいと思います。

cd ~/Documents

私はこれを行うために、これをすべてのディレクトリに一般化したいと思います。

mv file.tex ~/Documents
follow

そして、followコマンドが前のコマンドからターゲットを読み取り、それに応じて実行されるようにします。単純なディレクトリでは時間がかかりませんが、ネストされたディレクトリを使用するときに次のものを使用できる場合

mv file.tex ~/Documents/folder1/subfolder1
follow

私はそれが比較的簡単だと思い、次のようにすることができました:

follow()
{
    place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
    cd $place
}

しかし、これはうまくいかないようです。 echoを実行すると、$place目的の文字列が得られますが(を使用してテスト中です~/Documents)、最後のコマンドは返します。

No such file or directory

ディレクトリが存在します。私は迷っています。助けてください?

答え1

関数を定義する代わりに、$_前のコマンドの最後の引数に拡張された変数を使用できますbash。したがって、以下を使用してください。

cd "$_"

mv注文後。

履歴拡張を使用することもできます。

cd !:$

機能を使用する必要がある場合:

follow () { cd "$_" ;}

$ follow () { cd "$_" ;}
$ mv foo.sh 'foo bar'
$ follow 
foo bar$ 

気づく:この答えは、位置引数の処理に使用する正確なコマンドライン引数の形式についてです。たとえば、事前に特定の検査を組み込む必要がある他の形式では、mv -t foo bar.txtラッパーが適しています。

答え2

標準bashキーバインディングを使用するこの組み合わせは、前のコマンドラインAlt.の最後の引数を現在のコマンドラインにコピーします。だから入ってください

$ mv foo ~/some/long/path/
$ cd <Alt><.>

生産します

$ mv foo ~/some/long/path/
$ cd ~/some/long/path/

単語よりもタイピング回数も少ないfollow

利便性を高めるために、繰り返しのAlt.組み合わせは、前のすべてのコマンドラインの最後の引数を取得します。

付録:このキーの組み合わせに対応するbashコマンド名はまたはyank-last-argですinsert-last-argument。 「記録操作コマンド」の下のbashのマンページにあり、詳細は以下の通りです。バッシュリファレンスマニュアル.)

答え3

パラメータ拡張の前にチルダ拡張が発生する問題にほぼ確実に直面します。これはきちんとした例で説明できます。

$ cd ~kaz
kaz $ var='~kaz'
kaz $ echo $var
~kaz
kaz $ cd $kaz
bash: cd: ~kaz: No such file or directory

これで解決できますevaleval履歴からコマンドをインポートし、コマンドには次の任意の拡張機能を含めることができるので、とにかく必要です。

$ mv file.tex ~/Documents/$(compute_folder_name foo-param)/subfolder1
$ follow

(これらの値を再拡張すると、発生した元の拡張と一致しなくなる可能性があるなど、いくつかの問題があります。いくつかのグローバルcompute_folder_name変数を増やす関数を考えてみましょう。)

関連情報