Kendimi bir çok kez tekrarlarken buluyorum:
mkdir longtitleproject
cd longtitleproject
Dizin adını tekrarlamadan tek satırda yapmanın bir yolu var mı? Ben bash buradayım.
mkdir longtitleproject
sonracd !^
Kendimi bir çok kez tekrarlarken buluyorum:
mkdir longtitleproject
cd longtitleproject
Dizin adını tekrarlamadan tek satırda yapmanın bir yolu var mı? Ben bash buradayım.
mkdir longtitleproject
sonracd !^
Yanıtlar:
Yerleşik bir komut yoktur, ancak mkdir
sonra çağırdı bir işlevi kolayca yazabilirsiniz cd
:
mkcd () {
mkdir "$1"
cd "$1"
}
Bu kodu ~/.bashrc
dosyanıza yerleştirin (veya ~/.kshrc
ksh kullanıcıları veya ~/.zshrc
zsh kullanıcıları için). Adı verilen bir işlevi tanımlar mkcd
. "$1"
çalıştırdığınızda, fonksiyonun argümanı ile değiştirilecektir.
Bu basit sürümün birkaç kusuru var:
-p
seçeneği için ilet mkdir
. (Bu tespit edilmemiş giden bir yazım hatası riskini, örneğin arttıkça bu ya, arzu olabilir veya olmayabilir mkcd mydierctory/newsub
mutlu yaratacak mydierctory
ve mydierctory/newsub
oluşturmak anlamına zaman newsub
mevcut iç mydirectory
.)-
ancak sadece değilse -
, o zaman mkdir
ve cd
bir seçenek olarak yorumlayacaktır. Eğer sadece -
, o cd
zaman demek için yorumlayacağım $OLDPWD
. O geçtiyse +
0 veya daha fazla basamaklı sağlandığı sonra cd
zsh içinde dizin yığınında bir endeks olarak yorumlayacaktır. İlk sorunu çözebilir, ancak diğer ikisini değil --
argümandan önce geçerek düzeltebilirsiniz . ./
Göreceli bir yol ise argümana hazırlanarak tüm bu sorunları çözebilirsiniz .mkdir
takip etmez CDPATH
, ama cd
öyle yapar, yani CDPATH
başlamayan bir değere .
(kuşkusuz sıra dışı bir konfigürasyona) ayarladıysanız , cd
sizi daha önce yaratıldığından farklı bir dizine götürebilir. ./
Göreceli yollara hazırlık yapmak bunu düzeltir ( CDPATH
göz ardı edilmesine neden olur ).mkdir
başarısız, bu yürütmeye çalışır cd
. Onar: &&
iki komutu ayırmak için kullanın.Hala oldukça basit:
mkcd () {
case "$1" in /*) :;; *) set -- "./$1";; esac
mkdir -p "$1" && cd "$1"
}
Bu sürüm hâlâ bir kenarda yaratılmış olandan cd
farklı bir dizine girme potansiyeline sahip mkdir
: argüman sembolik bir bağlantı mkcd
içeriyor ..
ve içeri giriyorsa. Geçerli dizin ise, örneğin, /tmp/here
ve mylink
bir sembolik bağ için /somewhere/else
, daha sonra mkdir mylink/../foo
oluşturur /somewhere/else/foo
oysa cd mylink/../foo
içine değişiklikleri foo
. Argümandaki sembolik bağları aramak yeterli değildir, çünkü kabuk aynı zamanda kendi geçerli dizinindeki sembolik bağları da takip eder, yani cd /tmp/mylink; mkdir ../foo; cd ../foo
yeni dizine ( /somewhere/else/foo
) değil içine dönüşür /tmp/foo
. Bunun için düzeltme, cd
yerleşimin ..
önce tüm yol bileşenlerini çözmesine izin vermektir ( foo/..
eğerfoo
yok, bu yüzden mkdir
hiçbirini görmeye gerek yok ..
).
Hafif kanlı versiyonda bu sağlamlığa geldik:
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
}
(Alıştırma: neden ilk cd
arama için bir deniz kabuğu kullanıyorum ?)
Mkdir başarısız olursa, geçerli dizini değiştirmediğinizden emin olmak istiyorum. Cd - veya $ OLDPWD ile tekrar değiştirmek, kabuğun mevcut dizinine geçme iznine sahip değilse yeterli değildir. Ayrıca, cd çağrısı OLDPWD'yi günceller, bu yüzden sadece bir kez yapmak istiyoruz (veya OLDPWD'yi geri yüklemek).
Ayrıca, sözcüğü önceki satırdan yeniden yazmak zorunda kalmamanın daha az özelleşmiş yolları vardır:
cd
sonra, Esc .(veya Alt+ .) Önceki komutundan son argüman eklemek için.cd !$
yürütür cd
önceki komuta son argüman üzerinde.mkdir
üzere düzenleyin cd
.ksh
ve aynı zamanda çalışan zsh
) dizisidir. Çok sık kullanıyorum.
/a/b/..//
aslında işe yarar ama işe yaramadı /a/b/../c
. Sabit. Soruyu daha geniş bir kitleye koydum.
mkcd() { mkdir -p "$1" && cd "$1"; }
zsh de (benim örneğimde) bir sorun gibi görünmüyor. 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
(kurulumu ve içerir) /tmp/here/foo
neyin yaratıldığını (ve ne beklediğimi) gösterir. bash
hatalı şekilde yaratır ve değişir /var/tmp/somewhere/foo
.
İhtiyacın olan tek gömlek bu. Başka bir yapılandırma gerekmez:
mkdir longtitleproject && cd $_
$_
Değişken, bash, önceki komuta verilen son argümandır. Bu durumda, az önce oluşturduğunuz dizinin adı. Açıklandığı gibi 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.
Kullanım cd $_
yerine önceki komuta son argüman almak için cd !$
çünkü cd !$
önceki komuta son argüman verir kabuk tarihinin :
cd ~/
mkdir folder && cd !$
evden çıkarsın (veya ~ /)
cd ~/
mkdir newfolder && cd $_
Sonunda evde yeni klasörde !! (veya ~ / newfolder)
mkdir foo && cd foo
, ki kullanışlı değil.
Bu davranışı dizginlemek hiç aklıma gelmezdi, çünkü aşağıdakilere saatlik olarak yaklaşıyorum ...
$ mkdir someDirectory<ENTER>
$ cd !$
bash'ın !$
son satırın son kelimesiyle ikame edildiği; yani girdiğiniz uzun dizin adı.
Ek olarak, dosya adı tamamlama böyle durumlarda arkadaşınızdır. Yeni dizininiz klasördeki tek dosyaysa, hızlı bir çift TAByeni dizini yeniden girmeden verir.
Bash'ın diğer ortak görevler gibi komutları çalıştırmanıza izin vermesi harika olsa da, diğer cevapların önerdiği gibi bash'ın sunduğu komut satırı düzenleme özelliklerini öğrenmenin daha iyi olacağını düşünüyorum, böylece başka bir makinede çalışırken sözdizimsel eksik özel komut dosyalarınızın sağladığı şeker.
Gereğince Ne özelleştirmeler verimliliği artırmak için kabuk profilinizde yaptık? , bu nasıl yaparım:
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
bu, eğer dizin zaten mevcutsa da çalışır.
-p
Mkdir seçeneği hataları bastırır.
mcd
emir nedir? Bu komutu hangi paket veya proje veriyor?
Oh My Zsh kullanıyorsanız, tam olarak bunu yapan, take adlı bir komut var . Böyle bir şey olurdu.
take myfolder
Aslında bunu kazara buldum. Sadece baktım ve bu hilebazda Oh My Zsh GitHub wiki'den listeleniyor . Oldukça yararlı bir komut ve kendini yaratması çok kolay.
take
:) Mükemmel! btw - Oh My Zsh ile iTerm2. Aslında burada 3 mükemmel cevap var. Bu, @ jesús-carrera tarafından yazılan ve seçilen cevap. Kurulumunuza ve tercihlerinize göre değişir.
İşte bahsetmeye değer hafif bir değişken:
function mkdir() {
local dir=$1
command mkdir "$dir" && cd "$dir"
}
Bunu kendinize ekleyin ~/.bash_profile
ve mkdir
normal olarak kullanabilirsiniz (bir kez yaptıktan sonra source
), şimdi hariç, standart mkdir
komut yerine yukarıdaki işlevi çalıştıracaktır .
Not, bu, Gilles tarafından kabul edilen cevaba göre girdiyi doğrulamaz , ancak yerleşikleri nasıl geçersiz kılabileceğinizi gösterir.
Dokümanlardan (biraz tekrarlayan):
command mkdir [args]
ishalmkdir
ileargs
adı geçen tüm kabuk işlevini görmezdenmkdir
. Yalnızca PATH'de arama yaparak bulunan kabuk yerleşik komutları veya komutları yürütülür. Adında bir kabuk işlevi varsals
, çalışancommand ls
işlev içinde dış komutu yerine getirecektirls
yerine yinelemeli işlevi çağırmak
Ben de builtin
benzer bir sonuç elde ettiğime inanıyorum command
.
$dir
command
alternatif olarak kullanımını sunuyorum.
mkcd
Tek satırda ortamınıza komut oluşturun
echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc
Dizini yaratan bir komut dosyası hazırladım ve sonra cd ona bir takma ad verdim. Ve işte onu tarif ettiğim yerin özü.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
Sadece yukarıdaki cevapları otomatik hale getirin ve bir kez çalıştırılabilir bir komut dosyası yaptı:
fun='
mkcd ()
{
mkdir -p -- "$1" && cd -P -- "$1"
}'
echo "$fun" >> ~/.bashrc
Sadece bunu yeni bir dosyaya kopyalayın mkcd.sh
ve terminal tarafından sadece bir kez çalıştırın bash mkcd.sh
. Sonra source ~/.bashrc
geçerli oturumda çalışmasını sağlamak için yürütün .
Bundan sonra, mkcd some_dir
doğrudan bu dizinde oluşturmak ve girmek için kullanabilirsiniz .
~/.bashrc
dosyaya eklemek olan bir komut dosyasını (bir dosyada) yazmayı öneriyorsunuz ( zaten verilen bir cevapla)? Peki bu mkcd.sh
senaryoyu oluşturmayı nasıl önerirsin ? Belki bir editörle? Bu sadece düzenlemeden daha fazla iş gibi görünüyor ~/.bashrc
. Bunun kabul edilen cevaba göre avantajı nedir? ……………………………………………………………………… PS Bu, kendi kendinize bile denemediğinizi söyleyen sorunlardan dolayı başarısız olacaktır.
mcd
.stackexchange.com/questions/6628/…