it-swarm-tr.com

Bir dizin oluşturmamı ve aynı zamanda bu dizine geçmemi sağlayan tek bir katman var mı?

Kendimi bir çok tekrarlayan buluyorum:

mkdir longtitleproject
cd longtitleproject

Dizin adını tekrar etmeden bir satırda yapmanın bir yolu var mı? Burada bashtayım.

166
methodofaction

Yerleşik komut yoktur, ancak mkdir sonra cd çağıran bir işlevi kolayca yazabilirsiniz:

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

Bu kodu ~/.bashrc dosyanıza (veya ksh kullanıcıları için ~/.kshrc veya zsh kullanıcıları için ~/.zshrc) yerleştirin. mkcd adlı bir işlevi tanımlar. "$1" işlevi çalıştırdığınızda işlevin bağımsız değişkeni ile değiştirilir.

Bu basit sürümün birkaç kusuru vardır:

  • Aynı anda bir alt dizin zinciri oluşturamazsınız. Düzeltme: -p seçeneğini mkdir öğesine geçirin. (Tespit edilemeyen bir yazım hatası riskini artırdığı için bu istenebilir veya edilmeyebilir, örneğin, mkcd mydierctory/newsub, mevcut mydierctory içinde newsub oluşturmak istediğinizde mutlu bir şekilde mydirectory ve mydierctory/newsub oluşturur.)
  • Eğer argüman - ile başlıyor ancak sadece - ile başlamıyorsa, mkdir ve cd bunu bir seçenek olarak yorumlayacaktır. Eğer sadece - ise, cd bunu $OLDPWD olarak yorumlayacaktır. + ve ardından 0 veya daha fazla basamak varsa, zsh içindeki cd dizini dizin yığınında bir dizin olarak yorumlar. Argümden önce -- ileterek ilk sorunu düzeltebilirsiniz ancak diğer ikisini de düzeltemezsiniz. Göreli bir yolsa, ./ değişkenini bağımsız değişkene ekleyerek bu sorunların tümünü düzeltebilirsiniz.
  • mkdirCDPATH öğesini izlemez, ancak cd bunu yapar, bu nedenle CDPATH öğesini . (kuşkusuz alışılmadık bir yapılandırma) ile başlamayan bir değere ayarlarsanız, cd sizi olduğu gibi farklı bir dizine getirebilir yeni oluşturuldu. ./ öğesini göreli yollara eklemek bunu düzeltir (CDPATH'ın yok sayılmasına neden olur).
  • mkdir başarısız olursa, cd öğesini çalıştırmayı dener. Düzeltme: İki komutu ayırmak için && işlevini kullanın.

Hala oldukça basit:

mkcd () {
  case "$1" in /*) :;; *) set -- "./$1";; esac
  mkdir -p "$1" && cd "$1"
}

Bu sürüm hala cd'ın mkdir'ın sadece bir Edge durumunda oluşturduğu dizinden farklı bir dizine gitme potansiyeline sahiptir: mkcd argümanı .. içeriyorsa ve sembolik bir bağlantıdan geçiyorsa. Örneğin, geçerli dizin /tmp/here ve mylink ise /somewhere/else için sembolik bir bağlantıysa, mkdir mylink/../foo/somewhere/else/foo öğesini oluştururken cd mylink/../foofoo olarak değişir. Kabuk ayrıca kendi geçerli dizinindeki sembolik bağlantıları da izlediğinden, argümandaki sembolik bağlantıları aramak yeterli değildir, bu nedenle cd /tmp/mylink; mkdir ../foo; cd ../foo yeni dizine (/somewhere/else/foo) değil, /tmp/foo'ye dönüşür. Bunun için bir düzeltme ilk olarak cd yerleşiminin tüm .. yol bileşenlerini çözmesine izin vermektir (foo yoksa foo/.. kullanmak mantıklı değildir, bu nedenle mkdir'nin hiçbir .. işlevini görmesi gerekmez).

Bu sağlam, biraz kanlı bir versiyona geliyoruz:

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 çağrısı için alt kabuk kullanıyorum?)

Mkdir başarısız olursa, geçerli dizini değiştirmediğinizden emin olmak istiyorum. Shell'in geçerli dizinine geçme izni yoksa cd - veya $ OLDPWD ile geri dönmek yeterli değildir. Ayrıca, cd çağrısı OLDPWD'yi günceller, bu yüzden sadece bir kez yapmak isteriz (veya OLDPWD'yi geri yükleriz).


Word'ü önceki satırdan yeniden yazmak zorunda kalmamak için daha az özel yollar da vardır:

  • cd yazın, ardından Esc. (veya Alt+.) önceki komuttan son bağımsız değişkeni eklemek için.
  • cd !$, önceki komutun son bağımsız değişkeninde cd öğesini yürütür.
  • Basın Up önceki komut satırını çağırmak için mkdir öğesini cd olarak değiştirmek üzere düzenleyin.

Bu, ihtiyacınız olan tek astar. Başka yapılandırma gerekmez:

mkdir longtitleproject && cd $_

Bash cinsinden $_ Değişkeni, önceki komuta verilen son bağımsız değişkendir. Bu durumda, az önce oluşturduğunuz dizinin adı. man bash Bölümünde açıklandığı gibi:

_         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 $_ Yerine önceki komutun son argümanını almak için cd !$ Kullanın, çünkü cd !$ Önceki komutun son argümanını verir Kabuk geçmişinde:

cd ~/
mkdir folder && cd !$

eve gidiyorsun (ya da ~ /)

cd ~/
mkdir newfolder && cd $_

ev altında newfolder sonunda !! (veya ~/yeni klasör)

151
Jesús Carrera

Bu davranışı senaryolamak hiç aklıma gelmezdi, çünkü aşağıdakileri neredeyse saatlik olarak giriyorum ...

$ mkdir someDirectory<ENTER>
$ cd !$

burada bash nazikçe ikame eder !$ ile son satırın son Sözü; yani girdiğiniz uzun dizin adı.

Ayrıca, dosya adının tamamlanması bu gibi durumlarda arkadaşınızdır. Yeni dizininiz klasördeki tek dosya hızlı bir çift ise TAB yeni dizini tekrar girmeden verir.

Bash'ın diğer cevaplar gibi yaygın görevleri yazmanıza izin vermesi harika olmasına rağmen, bash'ın sunduğu komut satırı düzenleme özelliklerini öğrenmenin daha iyi olduğunu düşünüyorum, böylece başka bir makinede çalışırken sözdizimsel eksik değilsiniz. özel komut dosyalarınızın sağladığı şeker.

30
Rob

Göre Üretkenliği artırmak için Shell profilinizde hangi özelleştirmeleri yaptınız? , işte böyle yapıyorum:

# make a directory and cd to it
mcd()
{
    test -d "$1" || mkdir "$1" && cd "$1"
}

bu, dizin zaten mevcutsa da çalıştığı anlamına gelir.

17
Mikel

Oh My Zsh kullanıyorsanız, take adlı bir komut vardır. Böyle bir şey olurdu.

take myfolder

Aslında bunu kazara buldum. Ben sadece baktım ve Oh My Zsh GitHub wiki bu kazak listelenir. Oldukça kullanışlı bir komut ve görünüşe göre kendinizi oluşturmak çok kolay.

16
Jordan Harris

Veya anında kısa bir değişken oluşturabilir ve bunu iki kez kullanabilirsiniz x = longproject ; mkdir $x ; cd $x - itiraf ediyorum ki hala bir kabuk komut dosyası işlevi kullanmaktan daha uzun :)

3
sakisk

Dizini oluşturan bir komut dosyası hazırladım ve sonra cd'ler ona, sonra bir takma ad verdi. Ve işte burada tarif ettiğim bir Gist.

https://Gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be

0
Marcus Rehn

İşte bahsetmeye değer hafif bir varyant:

function mkdir() {
    local dir=$1
    command mkdir "$dir"  &&  cd "$dir"
}

Bunu ~/.bash_profile ve daha sonra mkdir'yi normal olarak kullanabilirsiniz (source 'd yaptıktan sonra), ancak şimdi standart mkdir komutu yerine yukarıdaki işlevi çalıştıracaktır .

Not, bu kabul edilen Gilles tarafından cevap göre girişi doğrulamaz, ancak yerleşikleri nasıl (etkin) geçersiz kılabileceğinizi gösterir.

Dokümanlardan (hafifçe yorumlama):

command mkdir [args], mkdir ile args çalışarak mkdir adlı Kabuk işlevini yok sayıyor. Yalnızca PATH aranarak bulunan Shell yerleşik komutları veya komutları yürütülür. ls adında bir Shell işlevi varsa, command ls işlev içinde, işlevi yinelemeli olarak çağırmak yerine ls harici komutunu yürütür

builtincommand ile benzer bir sonuç elde ettiğine inanıyorum.

0
Arj

BASH, ZSH veya KSH'ye yardımcı işlev ekleme

Tek satırda ortamınıza mkcd komutu oluşturun

echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc
0
Proximo