
次のように短い関数を作成したいと思います。 「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
これで解決できますeval
。eval
履歴からコマンドをインポートし、コマンドには次の任意の拡張機能を含めることができるので、とにかく必要です。
$ mv file.tex ~/Documents/$(compute_folder_name foo-param)/subfolder1
$ follow
(これらの値を再拡張すると、発生した元の拡張と一致しなくなる可能性があるなど、いくつかの問題があります。いくつかのグローバルcompute_folder_name
変数を増やす関数を考えてみましょう。)