Kedi komutundan sonra bash yeni bir satıra komut istemi nasıl yapılır?


17

Ne alırım:

host:~ user$ cat example.txt
some texthost:~ stas$

Ne almak istiyorum:

host:~ user$ cat example.txt
some text
host:~ stas$

Böyle catdavranmamın bir yolu var mı ?

Mac OS X'te bash kullanıyorum.

Yanıtlar:


15

Çoğu unix aracı, metin dosyalarıyla iyi çalışacak şekilde tasarlanmıştır. Metin dosyası bir dizi satırdan oluşur. Bir satır, yeni satır karakteri ile biten bir dizi yazdırılabilir karakterden oluşur. Özellikle, boş olmayan bir metin dosyasının son karakteri her zaman yeni satır karakteridir. Açıkçası, example.txtyalnızca some textson satırsonu içermiyor, bu yüzden bir metin dosyası değil.

catbasit bir iş yapar; gelişigüzel dosyaları metin dosyalarına dönüştürmek o işin bir parçası değildir. Diğer bazı araçlar her zaman girdilerini metin dosyalarına dönüştürür; görüntülemekte olduğunuz dosyanın yeni satırla biteceğinden emin değilseniz, awk 1yerine çalıştırmayı deneyin cat.

Önceki komut imleci son kenar boşluğundan başka bir yerde bıraktıysa, bash'ın istemini sonraki satırda göstermesini sağlayabilirsiniz. Bunu .bashrc( Dennis Williamson'un bir teklifinin GetFree'sinin varyasyonu) içine koyun :

shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1

Çalışan bir çözüm ve kısa açıklama için çok teşekkür ederim! Bu biraz yoksul için anlıyorum cat, bu yüzden bu sorun beni tekrar rahatsız etmeye başladığı zaman için son çare olarak tutacağım.
Stanislav Shabalin

Bu bash tercihi olduğundan, boru komutlarını kırabilir mi?
Stanislav Shabalin

1
@StanislavShabalin Bu, boru hattını etkilemez, sadece komut istemini etkiler.
Gilles 'SO- kötü olmayı bırak'

Bu düzgün çalışması için "-1" sonra "COLUMNS" kaldırmanız gerekir.
rafak

Bu çözüm, terminal penceresi yeniden boyutlandırıldığında istemin hareket etmesine neden olur. Bu işi güvenilir bir şekilde yapmak için geçerli sütunu almak zorunda kaldım PROMPT_COMMANDve 0 değilse \n, ilk karakteri olarak bir newline ( ) kullanın PS1.
Brian Donovan

10

Aşağıdaki yöntemi tercih ederim ...

cat example.txt ; echo

Bu, içeriği değerlendirmez example.txtveya bazen yeni satır eklemez. Kedi yapıldıktan sonra sadece yeni bir satır gösterir, hatırlanması kolaydır ve kimse güçlü veya zayıf alıntıları doğru kullanıp kullanmadığını düşünmez.

Tek dezavantajı, dosyanın kendi sondaki yeni satırına sahip olması durumunda ekstra bir yeni satır elde etmenizdir.


7

@ Gilles'in cevabını kullanmaya başladım, ancak terminal sütun sayısını değiştirirse istemin artık beklendiği gibi bir satırın başında olmayacağını buldum. Bu, tmux / ekran bölmeleri, GUI kapsayıcısının manuel olarak yeniden boyutlandırılması, yazı tipi değişiklikleri vb. Gibi çeşitli nedenlerden kaynaklanabilir.

Gerçekten istediğim, terminal ilk sütundan başka bir şey istemini yazdırmaya başlarsa yeni satır ekleyecek bir şeydi. Bunu yapmak için, bu cevabı almak için kullandığım mevcut sütunu nasıl alacağımı anlamaya ihtiyacım vardı . Son çalışma istemi yapılandırması aşağıdadır:

###
# Configure PS1 by using the old value but ensuring it starts on a new line.
###
__configure_prompt() {
  PS1=""

  if [ "$(__get_terminal_column)" != 0 ]; then
    PS1="\n"
  fi

  PS1+="$PS1_WITHOUT_PREPENDED_NEWLINE"
}

###
# Get the current terminal column value.
#
# From /programming//a/2575525/549363.
###
__get_terminal_column() {
  exec < /dev/tty
  local oldstty=$(stty -g)
  stty raw -echo min 0
  echo -en "\033[6n" > /dev/tty
  local pos
  IFS=';' read -r -d R -a pos
  stty $oldstty
  echo "$((${pos[1]} - 1))"
}

# Save the current PS1 for later.
PS1_WITHOUT_PREPENDED_NEWLINE="$PS1"

# Use our prompt configuration function, preserving whatever existing
# PROMPT_COMMAND might be configured.
PROMPT_COMMAND="__configure_prompt;$PROMPT_COMMAND"

Bu çözümü kullanıyorum, ancak çok satırlı komutları kabuğuma yapıştırmaya çalıştığımda, ilk yapıştırıldıktan sonra satırların bir kısmını / tamamını yiyor gibi görünüyor. Bunun herhangi bir çözümü var mı?
onlynone

@onlynone muhtemelen komutlarınız tek tek ve zamanında yıkanmıyor __get_terminal_columnmu?
Androbin

Bunun yerine PS1="\n"sadece echodeğiştirmem gerek ve gerek yok PS1.
Androbin

4

Buradaki sorun, example.txt dosyanızın dosyanızın sonunda bir yeni satıra sahip olmaması olabilir.


2
Mesele şu ki, dosyanın sonunda bir satırsonu olup olmadığı umurumda değil. Ben kedi çıktı daha net görmek istiyorum ve bu yıkıcı değil :-) Ve ben bunun catiş olmadığını anlamak bu yüzden muhtemelen bazı geçici çözüm arıyorum.
Stanislav Shabalin

1
Bu böyle bir cevap example.txtolmayan dosyanın sonunda yeni bir satır olmaması sorunun tüm noktasıdır.
Willem D'Haeseleer

2

Kullanmakta ısrar ederseniz cat, sonunda iki satırlı ve satırsız olarak her iki dosya türü için de çalışır:

echo "`cat example.txt`"

Bunu, seçtiğiniz adda (çift cat) seçtiğiniz bir işleve dönüştürebilirsiniz .bashrc:

cat1(){ echo "`/bin/cat $@`";}

1
Şimdi, bu çalışıyor olsa bile, biraz fazla ;-) Teşekkürler olsa!
Stanislav Shabalin

0

.bashrc'ye de ekleyebilirsiniz

PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"

benim için çalışıyor.


1
Bu, bir yardımcı program bir satırsonu tarafından uygun şekilde sonlandırılan bir şey çıkardığında terminalde fazladan boş bir satır ekler .
Kusalananda

Bu doğru. Ama basit ve fazladan bir çizginiz olması sizi rahatsız etmiyorsa ...
klaus
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.