GNU/Linux >> Znalost Linux >  >> Linux

odeslání textového vstupu na oddělenou obrazovku

Mohu vyřešit alespoň část problému:proč stop část nefunguje. Experimentálně, když spustíte relaci obrazovky v odděleném režimu (screen -d -m ), není vybráno žádné okno, takže vstup bude odeslán později s screen -X stuff je prostě ztracen. Musíte explicitně určit, že chcete posílat úhozy do okna 0 (-p 0 ). To je každopádně dobrý nápad pro případ, že z nějakého důvodu vytvoříte v této relaci obrazovky další okna.

screen -S minecraft -p 0 -X stuff "stop^M"

(Překlad obrazovky ^M na control-M, což je znak odeslaný Enter klíč.)

Problém se spuštěním relace ze skriptu pravděpodobně souvisí s unMENU.


Nejprve poznámka o snadném zadávání nových řádků:

Jen upozornění, že $() konstrukt odřízne nové řádky z výstupu příkazu, takže výstupní řádky lze použít jako argumenty pro jiné programy. To může způsobit neočekávané chování. V tomto případě předpokládám, že se konkrétně pokoušíte odeslat ekvivalent Enter stisknutí klávesy. Zatímco návrat vozíku odesíláte s \r nebude pruhovaný, existuje několik snadnějších způsobů, jak zadat tento znak bez potřeby dalšího příkazu.

  1. Do dvojitých uvozovek můžete umístit běžný nový řádek

    screen -S minecraft -X stuff "stop
    "
    
  2. Nebo můžete znak zadat do terminálového řádku pomocí Ctrl +v Zadejte sekvence. Bude to vypadat nějak jako ^M v terminálu, ale je to speciální znak nového řádku.

    screen -S minecraft -X stuff "stop^M"
    

Za druhé, poznámka k nevyzpytatelnému chování obrazovky. (Vysvětlení a řešení Gilles)

Obrazovka má problém s přijetím vstupu do relace obrazovky, která nebyla nikdy připojena. Pokud toto spustíte, dojde k selhání:

screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Ale pokud to spustíte, bude to fungovat:

screen -d -m -S minecraft zsh
screen -r minecraft (then disconnect with Ctrl-a-d)
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Nakonec můžete použít mnohem lépe fungující tmux místo screen .

GNU-Screen byl de-facto terminálový multiplexer již mnoho let, ale již dávno není vyvíjen a chyby a vtípky se neopravují. Tmux je v aktivním vývoji, obsahuje mnoho funkcí, kterých se obrazovka nedotkne, a jeho chování po vybalení je spíše intuitivní. Navíc je to lépe zdokumentované. Zde je návod, jak převést kód:

# Start new detached tmux session with a named window pane running the java app
tmux new-session -d -n minecraft /usr/lib/java/bin/java [args]

# Send it keys to stop the mincraft server
tmux send-keys -t minecraft "stop^M"

Omlouvám se za vykopání tohoto starého příspěvku, ale pomohlo by mi to v mém úsilí, kdyby byly tyto informace dostupné v době, kdy jsem měl podobný problém. Existuje mnoho otázek o tom, jak odesílat příkazy obrazovky ve skriptu bash. Stejně jako u kočičí kůže to může být provedeno, ale mám rád tento způsob. S tímto můžete odeslat jakýkoli příkaz nebo říci cokoliv pouhým voláním funkce say_this.

#!/bin/bash

say_this()
{
    screen -S minecraft -p 0 -X stuff "$1^M"
}

say_this "say Saving world"
say_this "save-off"
say_this "save-all"
...

Toto je s ssh!

#!/bin/bash

say_this()
{
    # Dont forget to set NAME or whatever
    ssh -p 8989 192.168.1.101 screen -S $NAME -p 0 -X stuff \"$1^M\"
}

say_this "say test"
say_this "say [email protected]#$%^&*()<>?This string will work!"

Linux
  1. Linux – odesílání textového vstupu na samostatnou obrazovku?

  2. Rozlišení obrazovky neuvedené?

  3. Upravit příchozí poštu z textu/prostého na text/html?

  1. Jak funguje vstup z klávesnice a textový výstup?

  2. Jak nabootovat do režimu True Text?

  3. Zabijte relaci oddělené obrazovky

  1. Odesíláte vstup na relaci obrazovky zvenčí?

  2. Gnu Screen:Vytisknout samostatnou relaci Stdout?

  3. Linux – Zakázat zatemnění obrazovky na textové konzoli?