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 cat
davranmamın bir yolu var mı ?
Mac OS X'te bash kullanıyorum.
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 cat
davranmamın bir yolu var mı ?
Mac OS X'te bash kullanıyorum.
Yanıtlar:
Ç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.txt
yalnızca some text
son satırsonu içermiyor, bu yüzden bir metin dosyası değil.
cat
basit 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 1
yerine ç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
PROMPT_COMMAND
ve 0 değilse \n
, ilk karakteri olarak bir newline ( ) kullanın PS1
.
Aşağıdaki yöntemi tercih ederim ...
cat example.txt ; echo
Bu, içeriği değerlendirmez example.txt
veya 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.
@ 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"
__get_terminal_column
mu?
PS1="\n"
sadece echo
değiştirmem gerek ve gerek yok PS1
.
Buradaki sorun, example.txt dosyanızın dosyanızın sonunda bir yeni satıra sahip olmaması olabilir.
cat
iş olmadığını anlamak bu yüzden muhtemelen bazı geçici çözüm arıyorum.
example.txt
olmayan dosyanın sonunda yeni bir satır olmaması sorunun tüm noktasıdır.
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 $@`";}
.bashrc'ye de ekleyebilirsiniz
PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"
benim için çalışıyor.
cat
, bu yüzden bu sorun beni tekrar rahatsız etmeye başladığı zaman için son çare olarak tutacağım.