私は多くのことを繰り返しています:
mkdir longtitleproject
cd longtitleproject
ディレクトリ名を繰り返さずに1行でそれを行う方法はありますか?私はここでバッシュしています。
mkdir longtitleproject
その後cd !^
私は多くのことを繰り返しています:
mkdir longtitleproject
cd longtitleproject
ディレクトリ名を繰り返さずに1行でそれを行う方法はありますか?私はここでバッシュしています。
mkdir longtitleproject
その後cd !^
回答:
組み込みコマンドはありませんがmkdir
、then を呼び出す関数を簡単に作成できますcd
。
mkcd () {
mkdir "$1"
cd "$1"
}
このコードを~/.bashrc
ファイルに(または~/.kshrc
kshユーザー、または~/.zshrc
zshユーザー用に)配置します。という関数を定義しますmkcd
。"$1"
関数を実行すると、関数の引数に置き換えられます。
この単純なバージョンにはいくつかの欠陥があります。
-p
オプションをに渡しますmkdir
。(これは、タイプミスが検出されないリスクを高めるため、望ましい場合と望ましくない場合があります。たとえば、mkcd mydierctory/newsub
喜んで作成する場合mydierctory
や、既存のmydierctory/newsub
を作成する場合です。)newsub
mydirectory
-
、ただではありません-
し、mkdir
そしてcd
オプションとしてそれを解釈します。それがちょうどなら-
、cd
それを意味するように解釈します$OLDPWD
。+
0桁以上の数字が続く場合cd
、zshはそれをディレクトリスタック内のインデックスとして解釈します。--
引数の前に渡すことで、最初の問題を修正できますが、他の2つの問題は修正できません。./
引数が相対パスの場合、引数の前に追加することにより、これらの問題をすべて修正できます。mkdir
従わないがCDPATH
、従わないcd
ので、もしあなたが(CDPATH
明らかに.
やや珍しい構成)で始まらない値に設定したなら、cd
作成されたディレクトリとは異なるディレクトリにあなたを連れて来るかもしれない。./
相対パスの前に付けると、これが修正されます(CDPATH
無視されます)。mkdir
失敗し、それが実行しようとしますcd
。修正:&&
2つのコマンドを分離するために使用します。まだかなり簡単です:
mkcd () {
case "$1" in /*) :;; *) set -- "./$1";; esac
mkdir -p "$1" && cd "$1"
}
このバージョンには、1つのエッジケースで作成されたcd
ディレクトリとは異なるディレクトリに移動する可能性があります。シンボリックリンクmkdir
をmkcd
含む引数が含まれている場合..
。たとえば、現在のディレクトリが/tmp/here
でmylink
あり、へのシンボリックリンクである/somewhere/else
場合、mkdir mylink/../foo
作成しますが/somewhere/else/foo
、にcd mylink/../foo
変更しfoo
ます。引数でシンボリックリンクを探すだけでは十分ではありません。シェルは独自の現在のディレクトリのシンボリックリンクも追跡するためcd /tmp/mylink; mkdir ../foo; cd ../foo
、新しいディレクトリ(/somewhere/else/foo
)ではなくに変更するため/tmp/foo
です。これに対する修正は、最初にcd
すべての..
パスコンポーネントをビルトインで解決できるようにすることfoo/..
です(以下の場合は使用する意味がありません)。foo
存在しないため、mkdir
表示する必要はありません..
)。
私たちは、この頑強なバージョンをわずかに使い古したものにします:
mkcd () {
case "$1" in
*/..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
/*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
/*) mkdir -p "$1" && cd "$1";;
*/../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
*) mkdir -p "./$1" && cd "./$1";;
esac
}
(練習:なぜ最初のcd
呼び出しにサブシェルを使用するのですか?)
mkdirが失敗した場合、現在のディレクトリを変更しないようにします。シェルで現在のディレクトリに変更する権限がない場合、cd-または$ OLDPWDで元に戻すことは十分ではありません。また、cdを呼び出すとOLDPWDが更新されるため、一度だけ実行する(またはOLDPWDを復元する)だけです。
また、前の行の単語を再入力する必要がない、それほど専門化されていない方法もあります。
cd
からEsc .(またはAlt+ .)、前のコマンドの最後の引数を挿入します。cd !$
cd
前のコマンドの最後の引数で実行されます。mkdir
しcd
ます。ksh
、で動作するzsh
)シーケンスです。頻繁に使用します。
mkcd() { mkdir -p "$1" && cd "$1"; }
zsh(の私のインスタンス)で問題ではないようです。 mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd
(セットアップを含み、/tmp/here/foo
作成されたもの(および私が期待したもの)を表示します。 bash
を誤って作成して変更し/var/tmp/somewhere/foo
ます。
これが必要なワンライナーです。他の設定は必要ありません:
mkdir longtitleproject && cd $_
$_
bash の変数は、前のコマンドに与えられた最後の引数です。この場合、作成したディレクトリの名前。で説明されているようにman bash
:
_ At shell startup, set to the absolute pathname used to invoke
the shell or shell script being executed as passed in the envi‐
ronment or argument list. Subsequently, expands to the last
argument to the previous command, after expansion. Also set to
the full pathname used to invoke each command executed and
placed in the environment exported to that command. When check‐
ing mail, this parameter holds the name of the mail file cur‐
rently being checked."$_" is the last argument of the previous command.
シェル履歴で前のコマンドの最後の引数を与えるためではcd $_
なく、前のコマンドの最後の引数を取得するために使用します。cd !$
cd !$
cd ~/
mkdir folder && cd !$
あなたは家に帰る(または〜/)
cd ~/
mkdir newfolder && cd $_
あなたは家の下の新しいフォルダになります!! (または〜/ newfolder)
mkdir foo && cd foo
が、便利ではありません。
次のように1時間ごとに入力するため、この動作をスクリプト化することは私には決してありませんでした...
$ mkdir someDirectory<ENTER>
$ cd !$
bash !$
は最後の行の最後の単語で親切に置き換えます。つまり、入力した長いディレクトリ名。
また、このような状況では、ファイル名の補完があなたの友達です。新しいディレクトリがフォルダ内の唯一のファイルである場合、クイックダブルTABは、再入力せずに新しいディレクトリを提供します。
bashを使用すると、他の回答が示唆するような一般的なタスクをスクリプト化できるので便利ですが、bashが提供するコマンドライン編集機能を学習して、別のマシンで作業しているときに構文が失われないようにすることをお勧めしますカスタムスクリプトが提供する砂糖。
あたりとしてどのようにカスタマイズあなたは、生産性を向上させるためにあなたのシェルプロファイルに行っていますか?、これは私がそれを行う方法です:
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
ディレクトリが既に存在する場合にも機能することを意味します。
-p
mkdir のオプションはエラーを抑制します。
mcd
コマンドは何ですか?このコマンドを提供するパッケージまたはプロジェクトはどれですか?
Oh My Zshを使用している場合、まさにこれを行うtakeというコマンドがあります。これは次のようになります。
take myfolder
私は実際にこれを偶然見つけました。私が見たところ、それはOh My Zsh GitHub wikiのこのチート攻略にリストされています。これは非常に便利なコマンドであり、明らかに自分で作成するのは非常に簡単です。
take
:)完璧!btw-Oh My Zshを使用したiTerm2。実際には、3つの完璧な答えがあります。これは@jesús-carreraによるもので、選択された答えです。セットアップと設定によって異なります。
言及に値するわずかなバリアントを次に示します。
function mkdir() {
local dir=$1
command mkdir "$dir" && cd "$dir"
}
これをに追加する~/.bash_profile
と、標準のコマンドではなく上記の関数を実行するようになることを除いて、mkdir
通常どおり(一度使用すると)使用できます。source
mkdir
これは、Gillesが受け入れた回答に従って入力を検証するものではありませんが、組み込みを(効果的に)オーバーライドする方法を示しています。
ドキュメントから(わずかに言い換え):
command mkdir [args]
という名前のシェル関数mkdir
をargs
無視して実行されmkdir
ます。シェルの組み込みコマンドまたはPATHの検索で見つかったコマンドのみが実行されます。名前のシェル関数が存在する場合ls
、実行されているcommand ls
機能の中には、外部コマンドを実行しますls
代わりに再帰関数を呼び出すと
とbuiltin
同様の結果が得られると思いますcommand
。
$dir
command
代替としての使用を提示しています。
ディレクトリを作成するスクリプトを作成し、そのディレクトリにcdして、エイリアスを指定しました。そして、ここに私がそれを説明する要点があります。
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
上記の回答を自動化し、1回限りの実行可能スクリプトを作成しました。
fun='
mkcd ()
{
mkdir -p -- "$1" && cd -P -- "$1"
}'
echo "$fun" >> ~/.bashrc
これを新しいファイルにコピーして、ターミナルmkcd.sh
で一度だけ実行しますbash mkcd.sh
。次にsource ~/.bashrc
、現在のセッションで動作するように実行します。
この後mkcd some_dir
、そのディレクトリに直接作成して入力するために使用できます。
~/.bashrc
ます(既に回答済み)。そして、このmkcd.sh
スクリプトの作成をどのように提案しますか?エディタを使用して、おそらく?これは単なる編集よりも多くの作業のように見えます~/.bashrc
。これは、受け入れられた答えに対してどのような利点がありますか?…………………………………………………………PSこれは引用の問題があるため失敗します。
mcd
unix.stackexchange.com/questions/6628/