มีทางลัดในการ mkdir foo และใส่ cd ลงไปทันทีหรือไม่?


89

นี่คือสิ่งที่ฉันทำบ่อยๆ

$ mkdir foo
$ cd foo

สิ่งนี้ทำงานเป็นคำสั่งเดียว แต่มีการกดแป้นมากกว่าและไม่ต้องเสียเวลา

$ mkdir foo && cd foo

มีทางลัดสำหรับสิ่งนี้หรือไม่?

แก้ไข

ด้วยการใช้ความช่วยเหลือด้านล่างนี้ดูเหมือนจะเป็นคำตอบที่หรูหราที่สุด

# ~/.bashrc
function mkcd {
  if [ ! -n "$1" ]; then
    echo "Enter a directory name"
  elif [ -d $1 ]; then
    echo "\`$1' already exists"
  else
    mkdir $1 && cd $1
  fi
}

1
คุณสามารถเปลี่ยนชื่อฟังก์ชั่นเป็นmkdirถ้าคุณใช้command mkdir $1แทนเพียงแค่mkdir $1ในร่างกายของฟังก์ชั่น
Andy

2
(1) ทำไมไม่ใช่แค่ "mkdir $ 1; cd $ 1" แทนที่จะเป็น "&&" วิธีนี้จะทำให้ "cd" ประสบความสำเร็จแม้ว่า "mkdir" จะล้มเหลวและคุณไม่จำเป็นต้องใช้โครงนั่งร้านที่มีอยู่แล้ว (2) ตามที่เขียนฟังก์ชั่นของคุณจะไม่ทำงาน (เพื่อขอให้คุณใส่ชื่อไดเรกทอรี) คุณต้องใส่ประโยคนั้นในประโยค "if" แยกต่างหากจากการทดสอบการมีอยู่ (ในปัจจุบันคือ "elif")
ต้มตุ๋น quixote

คำตอบ:


45

ฉันไม่ผู้เชี่ยวชาญ Linux / ทุบตี .bashrcแต่พยายามวางนี้ในของคุณ

function mkdir
{
  command mkdir $1 && cd $1
}

PS command mkdirขอบคุณที่เดนนิสสำหรับการใช้


2
แทนการเพียงแค่ใช้`which mkdir` command mkdir
Dennis Williamson

1
ขอบคุณเดนนิส ไม่มีสิ่งใดภายใต้man command- คุณสามารถพาฉันไปอ้างอิงได้หรือไม่? (ผมสามารถทำงานออกสิ่งที่มันไม่ แต่จะจ่ายให้อย่างละเอียด;)
แอนดี้

2
commandอธิบายไว้ในคู่มือของbash (ซึ่งเป็นในตัวมันไม่ใช่คำสั่งแยกต่างหาก) help commandนอกจากนี้คุณยังสามารถลอง
grawity

นอกจากนี้ยังใช้งานได้กับ zsh btw
Florian Loch

93

bash, zshหอย

หากคุณไม่ต้องการให้ฟังก์ชันอื่นจดจำและไม่สนใจ bashisms:

$ mkdir /home/foo/doc/bar && cd $_

$_(ดอลล่าขีด) ตัวแปรคำสั่งทุบตีมีพารามิเตอร์ล่าสุด ดังนั้นหากผู้ใช้พิมพ์คำสั่งต่อไปนี้ที่บรรทัดคำสั่ง: echo foo bar && echo $_ bazผลลัพธ์จะเป็นดังนี้:

foo bar
bar baz

fishเชลล์

ในเปลือกปลาฉันจะพิมพ์ต่อไปนี้:

> mkdir / home / foo / doc / bar
> cd alt + ↑

ปุ่ม alt รวมกับปุ่มลูกศรขึ้นหรือลงจะวนไปตามประวัติพารามิเตอร์คำสั่ง


4
วิธีนี้ใช้ได้zshเช่นกัน
Nabil Kadimi

3
คุณช่วยอธิบายว่า $ _ คืออะไร? มือใหม่ที่นี่
arg20

@NabilKadimi คุณหมายความว่า <kbd> Alt <kbd> + <kbd> ⬆ <kbd> ทำงานได้ดีใน Zsh หรือไม่ ที่จริงแล้วด้วย zsh 5.4.2 และ on-my-zsh, Alt + ⬆ทำให้ฉันมีตัวอักษร 'A'
วันหยุดสุดสัปดาห์

+1 สำหรับ $ _ - Standid Sexy Flanders!
cig0

22

สำหรับผู้ใช้oh-my-zsh :
$ take 'directory_name'

การอ้างอิง: https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet


1
คุณช่วยอธิบายรายละเอียดนี้ได้ไหม?
bwDraco

@bwDraco แล้วคุณจะได้รับtype take take is a shell function from /home/username/.oh-my-zsh/lib/functions.zshvi ไฟล์จากนั้นคุณจะได้รับfunction take() { mkdir -p $@ && cd ${@:$#} }
วันหยุดสุดสัปดาห์

10

เกี่ยวกับ:

$ mkdir newdirname; cd $_

มันง่ายกว่าการใช้ && รวมคำตอบของ quack quixote และ kzh


26
ประเด็น&&คือcdจะไม่ถูกเรียกใช้งานหากmkdirคำสั่งล้มเหลว
slhck

1
@slhck จริง ๆ แล้วนั่นคือจุดของ quixote: cd แม้ว่า mkdir จะล้มเหลว (เช่นถ้ามันมีอยู่แล้วบังคับให้ผู้ใช้เขียนคำสั่งที่สองเพื่อ cd จริงไปยังเส้นทาง) อย่างไรก็ตามตรงกันข้ามกับสิ่งที่คำตอบนี้บอกว่านั่นไม่ใช่เรื่องง่าย: && ไม่ซับซ้อนกว่า;
moala

7

คุณสามารถลองสิ่งนี้:

#!/bin/sh
mkdir $1 && cd $1

บันทึกสคริปต์นี้ในบางที่ที่อยู่ในพา ธ ของคุณตัวอย่างเช่น / usr / local / bin หรือ ~ / bin (คุณต้องใส่อันสุดท้ายนี้ลงในพา ธ ของคุณในไฟล์ ~ / .profile) จากนั้นคุณสามารถเรียกมันว่า


4
มันทำงานอย่างไร ดูเหมือนว่าจะcdอยู่ในบริบทของการเรียกใช้~/bin/mkcdสคริปต์เท่านั้นไม่ใช่ผู้เรียกใช้สคริปต์
Erik Allik


2

นี่เป็นฟังก์ชั่นง่าย ๆ ที่ฉันใส่ไว้ใน~/.config/fish/config.fishไฟล์ของฉันซึ่งทำงานนี้สำเร็จ:

function mkcd
    mkdir -pv $argv;
    cd $argv;
end

-pvแท็กช่วยให้การสร้างของไดเรกทอรีที่มีไดเรกทอรีย่อยที่


0

ขึ้นอยู่กับผลลัพธ์ที่ต้องการหากมีไดเรกทอรีอยู่แล้ว

ล้มเหลวหากมีไดเรกทอรีอยู่แล้ว

mkcd() {
    mkdir $1 && cd $1
}

เปลี่ยนไดเรกทอรีโดยไม่คำนึงถึง

mkcd() {
    mkdir $1 ; cd $1
}

การใช้งาน mkcd บาง / เส้นทาง / ของฉัน / dir /


0

ฉันพบว่าฟังก์ชันด้านล่างสามารถสร้างได้เพียงไดเรกทอรีเดียวเท่านั้นหากฉันต้องการสร้างไดเรกทอรีย่อยในเวลาเดียวกันมันไม่ทำงาน:

function mkdir
{
  command mkdir $1 && cd $1
}

ดังนั้นฉันจึงเปลี่ยนและตอนนี้มันใช้งานได้ดีมาก!

function mkcd
{
  command mkdir -pv $1 && cd $1 && echo "Now in `pwd`"
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.