Metni bash komut satırı arabelleğine koy


9

Programlı olarak bash komut satırı arabelleğine belirli bir metin parçası koymak, düzenlenmek ve okumak için komut olarak kullanmak istiyorum.

Ben dört gözle bekliyorum read -iama komutlar için benzer bir şeydir .

-i text Satırı okumak için readline kullanılıyorsa, düzenleme başlamadan önce metin düzenleme arabelleğine yerleştirilir.

Düzenleme : Programsal olarak ben bir komut dosyasına bu yazmak , komut dosyası başlatmak ve komut arabelleği hazır veya komut geçmişi (bazı sorular önerdiği gibi) değiştirilmesini istiyorum demek .


IIRC screenbunu sizin için yapabilir.
Strugee

Yanıtlar:


6

Bunu fzf örnekler sayfasında yapmanın hileli bir yolunu buldum . Bu bash 4.3 ve perl 5.18 ile çalışır:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

Stdout komutunu yazdırır, ancak komut arabelleğine de kopyalar. Komutu doğrudan yürütmek istiyorsanız, bağlantılı sayfada bir örnek de vardır.


Bu cevap OP tarafından sorulan sorulara en yakın olanıdır.
reza.safiyat

Biraz farklı sözdizimi Bu yanıt , &TIOCSTIbiraz daha güzel olduğunu 0x5412da. Bazı platformlar (örneğin OpenBSD ) TIOCSTI'yi devre dışı bırakıyor gibi göründüğüne dikkat edin . Bence bu hem bu yaklaşım hem de zsh'ın print -zişe yaramayacağı anlamına geliyor .
dimo414

4

Eğer bir readline bağlayıcısı ile kullanacağınız bir fonksiyon için bu bind -xdeğişiklik yapabilirsiniz READLINE_LINE. ( Örnek )

Bir okuma çizgisi bağlamanın dışında, geçmişe sahte bir komut gönderebilirsiniz history -s.


Sorun şu ki history -s 'foo', bir senaryoda yaparsam , başlatılan kabuğun geçmişi hiç değiştirilmez
gioele

@gioele Kabuğun içinden başlatmanız gerekir (örneğin, yüklediğiniz bir komut dosyasından source). Ayrı bir süreçten hiçbir şey yapamazsınız.
Gilles 'SO- kötü olmayı bırak'

2

Gilles'in cevabı doğrudur, ancak tamamen tatmin edici değildir. Bu soruyu okurken, OP bir sonraki giriş satırına "önayar" yapmak istiyor. Benim durumumda PROMPT_COMMAND fonksiyonumda terminalin mevcut konumunu okumak istedim. Bu çalışır, ancak birincil kabuk ile aynı okuma arabelleğini kullanır ve böylece herhangi bir kullanıcı girişi, işlevde bir 'read' yerleşik çağrısı yaptığım gerçeği ile atılır. Bu yüzden, kullanıcı girişini ayrı ayrı okumak, terminal okumamı yapmak ve daha sonra orijinal girişi olan giriş arabelleğine geri okumak istedim. Bunun gerçekten de aynı süreç içinde olduğuna dikkat edin, bu yüzden teorik olarak mümkün olmalıdır.

Görebildiğim kadarıyla (bash 4.2'mde) bir şeyi program olarak giriş yığınına itecek bir işlev yok. Zsh'de 'print -z' kullanılıyor.

Cevap: bash'ta bu mümkün değil, bunun için zsh kullanmanız gerekiyor.


0

history -s 'foo'Denemek için bir alternatif olarak :

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
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.