Создайте команду путем помещения строки в tty

for dateNfile in $(grep dateishere *html | sed -r 's/^([^:]*):(.*)dateishere/\2:\1/' | sort -n)
do  
  name=${dateNfile/*:/}
  # echo date=${dateNfile/:*/}
  mv $name /other/location
done

Таким образом, я предполагаю, что существует всего одна строка на файл, содержа 'dateishere', и что строка запускается с даты, но команда sed могла быть изменена, для вырезания даты даже в других случаях.

Если бы у Вас есть пробелы в именах файлов, или разрывы строки и такой, вещи становятся немного более сложными, таким образом, я хотел бы проигнорировать их, если это возможно. Но от Вашего утверждения, это не имеет место.

15
26.02.2016, 01:09
4 ответа

Я просто нашел маленькую программу C названной writevt это добивается цели. Захватите исходный код здесь. Заставить его скомпилировать с gcc просто удалите следующие строки сначала:

#include <lct/cline.h>
#include <lct/utils.h>

Обновление. Команда является теперь частью консольных инструментов, таким образом доступных в более свежих системах, если Ваше распределение не использует kbd вместо консольных инструментов, в этом случае можно скомпилировать его из источника (много более поздней версии, никакая необходимая модификация).

Использование:

sudo writevt /dev/ttyN command 

Обратите внимание, что по некоторым причинам необходимо использовать '\r' (или '\x0D') вместо '\n' (или '\x0A') отправить возврат.

3
27.01.2020, 19:49
  • 1
    Это действительно работает, но существует путь, более неправильный, чем просто, они включают. Я должен был угробить функцию использования, сделать a progname и _, и прокомментируйте несколько вызовов функции в main() –  Michael Mrozek♦ 14.09.2012, 01:45
  • 2
    @MichaelMrozek _() функция обычно является знаком gettext того, чтобы быть используемым. Кажется небольшим излишеством для такой простой части демонстрационного кода, но не причиняет боль, я предполагаю. –  jw013 14.09.2012, 01:55

Терминал удваивается как две вещи: устройство ввода данных (такое как клавиатура) и дисплей (такой как монитор). Когда Вы читаете из терминала, Вы получаете то, что прибывает из устройства ввода данных. Когда Вы пишете в терминал, данные идут на дисплей.

Нет никакого общего способа вызвать вход в терминал. Редко существует любая потребность сделать так. Если необходимо взаимодействовать с программой, которая требует терминала, используйте специализированный эмулятор терминала те, которые Ожидают или Пустой, или обертка программируемого терминала, такая как Screen или Tmux. Можно вызвать вход в консоль Linux с ioctl. Можно вызвать вход в эмулятор терминала X11 с инструментами, такими как xdotool или xmacro.

10
27.01.2020, 19:49
  • 1
    Сделанный редактированием к моему сообщению. Взгляните и Вы будете видеть мои взгляды. –  Emanuel Berg 14.09.2012, 20:22
  • 2
    @EmanuelBerg Ваше редактирование трудно понять. Вы пытаетесь программно подать вход в программу, которую Вы также используете в интерактивном режиме? Если это - то, в чем Вы хотите, запускаете программу screen или tmux и используйте их stuff (экран) или send-key (tmux) команда или их функция буфера. –  Gilles 'SO- stop being evil' 14.09.2012, 21:11
  • 3
    Сделанный вторым редактированием с включенным кодом Perl - вызов двоичного файла C там.Я не знаю... поскольку это было настолько просто (всего, одна строка кода) - это действительно лучше, чтобы сделать это Ваш путь (с screen или tmux инструменты)? –  Emanuel Berg 15.09.2012, 02:34
  • 4
    @EmanuelBerg Так да, Вы ищете screen -X stuff 'note version one'. –  Gilles 'SO- stop being evil' 15.09.2012, 02:40

По крайней мере, Linux и BSDs имеют TIOCSTI ioctl для продвижения символов назад к терминальному входному буферу (до предела [4 096 символов на Linux]):

#include <sys/ioctl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>

void stackchar(char c)
{
  if (ioctl(0, TIOCSTI, &c) < 0) {
    perror("ioctl");
    exit(1);
  }
}
int main(int argc, char *argv[])
{
  int i, j;
  char c;

  for (i = 1; i < argc; i++) {
    if (i > 1) stackchar(' ');
    for (j=0; (c = argv[i][j]); j++) {
      stackchar(c);
    }
  }
  exit(0);
}

Скомпилируйте его и назовите его как:

cmd foo bar < "$some_tty"

продвигать символы назад на некотором tty.

И в жемчуге:

require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV;

Править: Я понимаю теперь, что это - тот же ioctl как в writevt решении. Комментарий и название команды вводят в заблуждение как работы TIOCSTI для любого терминала, не просто VTs.

7
27.01.2020, 19:49
  • 1
    Проверьте мое второе редактирование к вопросу. Я уже скомпилировал код, я получил от @htor - что я вижу, он работает отлично. Можно ли видеть, что какие-либо преимущества используют этот код вместо этого? (Но спасибо за Ваше усилие в любом случае.) –  Emanuel Berg 15.09.2012, 02:38
  • 2
    Да. Посмотрите мое недавнее редактирование. Точка должна использовать TIOCSTI ioctl. Код, который я дал, делает просто это на дескрипторе файла 0 (stdin). –  Stéphane Chazelas 15.09.2012, 10:42

У меня есть более полная демонстрация на Stack Overflow .

В python вы можете:

import fcntl
import sys
import termios

with open('/dev/tty1', 'w') as fd:
    for char in "ls -la\n":
        fcntl.ioctl(fd, termios.TIOCSTI, char)

Это предполагает простую "команду" значение ls -la и использование пути tty, указанного OP.

5
20.08.2021, 13:22

Теги

Похожие вопросы