Girişte kedinin faydalı veya yararsız kullanımı


3

MySQL geri yükleme komut dosyasında daha önce giriş için oluşturulmuş bir MySQL formunu kullanıyorum. Bu dosya adı komut satırında bir argüman olarak verilmiştir ve gziplenmiş olabilir veya olmayabilir. Dosyayı mysql deyimine girdi olarak kullanmak istiyorum ancak dosyayı değiştirmek / değiştirmek değil, sadece içeriği okumak.

(Sevdiğim) mysql komutuna giriş için aşağıdaki kodu kullanıyorum:

mysql -u $user -p"$pass" $dbname <( [[ "${mysqldumpfile: -3}" = ".gz" ]] && gzip -d -c "${mysqldumpfile}" || cat "${mysqldumpfile}" )

Bu yüzden mysql dump dosya ismi ".gz" ile biter, sonra stdout'a gunzip, aksi halde stdout'a bayılırım. Her ikisinden de stdout, mysql komutuna stdin olarak kullanılır.

Bu bir UUOC mi? Kedi kullanmamak için bir yolu var mı?

Bunu yapmanın başka bir yolu var mı (bir hatta)? Açık olmak gerekirse, if / then / else / deyimini kontrol etmek ve iki farklı mysql komutu yapmak istemiyorum. İki farklı giriş kullanabilen bir komut satırını seviyorum.

EDIT: zcat -fVeriler sıkıştırılmamışsa hem açacak hem de kedi veya sadece kedi olacağı için bu en iyi örnek değil. <( test && do_this_command_as_input || cat this_is_the_input )Kedi kullanmanın başka bir yolu olup olmadığını hala bilmek istiyorum .

Biri bundan bahsetmeden önce ... kullanarak bir mysql komut satırına giremezsiniz <( ).

Yanıtlar:


2

Bu aradığınız kedi değil :)

mysql -u $user -p"$pass" $dbname <(zcat -f  $mysqldumpfile)

Düzenleme: parantez unuttum

Düzenleme 2:

Tamam bu kez tamamen kedi veya zcat olmadan:

gunzip -f $mysqldumpfile 2>/dev/null; mysql -u $user -p"$pass" $dbname < ${mysqldumpfile%%.gz}

Yine de ilk seçeneği tercih et

Tamam 3. versiyon ve bitirdim: P

mysql -u $user -p"$pass" $dbname < (gzip -fdc $mysqldumpfile)

Yani kötü bir örnek, bu durumda zcat -f kedi gibi davranacak ... sanırım soruyu düzeltmek zorunda kalacağım.
johnnyB

kedi /
zcatsız

3

Bu yararsız kullanım değildir cat.

İhtiyacınız var catçünkü bunun yerine nötr filtre var gzip. Ya dosyayı işleyin gzipve sonra stdout'a boşaltın ya da işlem yapmayın ve stdout'a boşaltmayın.

Diyelim ki sadece gziplenmiş dosyalar alıyorsunuz, o halde komut şöyle görünür:

mysql -u $user -p"$pass" $dbname <( gzip -d -c "${mysqldumpfile}" )

Artık gereksinimler değişir ve yalnızca düz dosyalar elde edersiniz:

mysql -u $user -p"$pass" $dbname <( cat "${mysqldumpfile}" )

Bu yararsız bir kullanım olurdu catçünkü bu basitleştirilebilir:

mysql -u $user -p"$pass" $dbname "${mysqldumpfile}"

Komutunuzda catişlemi geçemezsiniz çünkü işlemi değiştiremezsiniz.


İşte ayrıntılı ve if then elseyalnızca bir mysqlsatırlık komutunuz .

togzip_ornottogzip() {
  if [[ "${mysqldumpfile: -3}" = ".gz" ]]; then
    gzip -d -c "${mysqldumpfile}"
  else
    cat "${mysqldumpfile}"
  fi
}

mysql -u $user -p"$pass" $dbname <( togzip_ornottogzip )

Şimdi bu komutu nasıl daha iyi yazabileceğime dair önerim:

Her zaman düz dosyaları stdin'de girdi olarak beklemek için betiğinizi yeniden yazmanızı öneririm:

mysql -u $user -p"$pass" $dbname <( cat )

Bu betiği çağıralım domysql_stdin

Ardından, her ikisi de bir dosya adı argümanı olarak alarak iki komut dosyası yazın. Biri gzipli dosyalar bekler, diğeri düz dosyalar bekler. Her ikisi de daha sonra çıktıyı ilk komut dosyasına yönlendirecektir.

Beklenen gzipli dosyalar:

gzip -d -c "${mysqldumpfile}" | domysql_stdin

Bekleyen düz dosyalar:

domysql_stdin < "${mysqldumpfile}"

Onları arayalım domysql_gzippedvedomysql_plain

Ardından dosya adını argüman olarak alan dördüncü bir komut dosyası yazın, dosyanın gzip olup olmadığını kontrol edin ve sonra gzip bekliyor komut dosyasını veya düz bekliyor komut dosyasını çağırın.

if [[ "${mysqldumpfile: -3}" = ".gz" ]]; then
  how="gzipped"
else
  how="plain"
fi

domysql_$how "${mysqldumpfile}"

Bu şekilde, her komut dosyası basit bir şey yapar ve her bölüm kendi başına kullanılabilir.

Dört dosya yerine her şeyi dört işlevli bir dosyaya koyabilirsiniz. Sadece isim çarpışmalarında ve değişken görünürlük ve kullanım ömründe dikkatli olmalısınız.


Çok ayrıntılı ve girdilerin sıkıştırılmış şekilde
bırakılmasını sağlar

Düzenlememi yapmadan önce yorum yazmana sevindim. Geliştirilmiş önerim daha da ayrıntılı. "Yaprak girişini sıkıştırılmış" ile ne demek istiyorsunuz? Gzip komutu olduğu gibi stdout'a açılır. Yazılan dosya yok.
lesmana

benim hatam, gzip'in, dosyayı diskte bırakacak olan gunzip için bir yazım hatası olduğunu farz ediyorum. Bana bir fikir
vermene
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.