web-dev-qa-db-ja.com

`mkdir`と` cd`を組み合わせますか?

以下を組み合わせる方法(bashで最も簡単な方法は何ですか)はありますか?

mkdir foo
cd foo

mkdirのマンページにはそのようなことは何も記載されていません。多分mkdirの派手なバージョンがあるのでしょうか?私はcdが組み込みのシェルでなければならないことを知っているので、同じことが空想mkdir...にも当てはまります。

エイリアシング?

141
Jasper

関数?

mkcdir ()
{
    mkdir -p -- "$1" &&
      cd -P -- "$1"
}

上記のコードを~/.bashrcまたは~/.bashrcをソースとする別のファイルに配置します。次に、変更を適用するためにターミナルを再起動します。

その後、単にmkcdir fooまたはmkcdir "nested/path/in quotes"を実行します。

ノート:

  • "$1"mkcdirコマンドの最初の引数です。スペースやその他の特殊文字が含まれている場合は、引用符で囲んで引数を保護します。
  • --は、新しいディレクトリに渡された名前がmkdirまたはcdのオプションとして解釈されないようにし、-で始まるディレクトリを作成する機会を与えますまたは--
  • mkdir-pを使用すると、ディレクトリがまだ存在しない場合に追加のディレクトリが作成され、-Pを使用するとcdでシンボリックリンクが解決されます。
114
Ouki

これを行うには、関数を作成するのが最も適切な方法だと思いますが、すべての代替方法をリストするために、次のように書くことができます。

mkdir foo && cd "$_"

$_は、前のコマンドの最後の引数を保持する特別なパラメーターです。 $_を囲む引用符は、フォルダー名にスペースが含まれている場合でも機能することを確認してください。

なぜ二重引用符を使用するのですか?

zshなどの一部のシェルでは、ディレクトリ名にスペースが含まれている場合でも、$_を囲む二重引用符は必要ありません。ただし、このコマンドがbashで機能するために必要です。

たとえば、macOS 10.13.6のbash 3.2.57で次のコマンドを実行します。

mkdir "my directory" && cd $_

この出力結果:

bash: cd: my: No such file or directory

ただし、$_を二重引用符で囲むと、コマンドは正常に戻ります。

bash-3.2$ mkdir "my directory" && cd "$_"
bash-3.2$ echo $?
0
bash-3.2$
256
Zajn

Bash(Wordデジグネーターを使用):

/tmp/bug$ mkdir "some dir"
/tmp/bug$ cd !$
cd "some dir"
/tmp/bug/some dir$ 

!$は、履歴の前の行の最後の引数に展開されます。間にパラメータがある場合は、最初の引数に!:1、2番目の引数に!:2を使用できます。

Bash(1)から:

イベント指定子

イベント指定子は、履歴リストのコマンドラインエントリへの参照です。絶対参照でない限り、イベントは履歴リストの現在の位置を基準にしています。

!空白、改行、復帰、=または(が続く場合を除いて、履歴置換を開始します(exttシェルオプションが組み込みのshoptを使用して有効になっている場合)。

[..]

単語指定子

単語指定子は、イベントから目的の単語を選択するために使用されます。 :は、イベント指定をWord指定子から分離します。 [..]

[..]
nn-番目の単語。
^最初の引数。つまり、Word 1です。
$最後の言葉。これは通常、最後の引数ですが、行に単語が1つしかない場合は、0番目の単語に展開されます。

17
Lekensteyn

これらの他の若者は人生を複雑にしています、ここにそれがあります:

eval {mkdir,cd}\ FOLDER\;
10
Sean D