Функции «вырезать» и «вставить» при использовании нескольких терминалов вместо «mv»

Если вы выполнили все, например, chmod +x /etc/rc.local, то ваша команда работает, просто она нигде не регистрируется, чтобы вы могли ее увидеть.

Пример

Это мой/etc/rc.local:

$ cat /etc/rc.local
#!/bin/bash
touch /var/lock/subsys/local
echo "hickory stick"

Здесь я использовал модифицированный Bash, который регистрируется в системном журнале, который я обсуждал в других вопросах и ответах U&L под названием:Отправка истории bash в системный журнал .

Когда моя система загружается, я вижу следующее сообщение, регистрируемое через Bash:

/var/log/bash-log/127.0.0.1.log:2018-07-24T22:04:24.609094-04:00 centos7 rc.local: hickory stick

Но больше нигде. Чтобы заставить это войти в syslog/rsyslog, вы обычно можете использовать команду loggerдля этого :

.

$ logger hi

Затем вы можете увидеть это в своем /var/log/messagesили /var/log/syslogили journal -xef. Здесь я использую journald:

$ journalctl -xef
Jul 24 20:23:04 centos7 bash[1629]: HISTORY: PID=1629 UID=0 USER=root CMD=man logger
Jul 24 20:23:24 centos7 bash[1629]: HISTORY: PID=1629 UID=0 USER=root CMD=logger hi
Jul 24 20:23:24 centos7 vagrant[1811]: hi

Вы должны иметь возможность использовать loggerдля захвата вывода команд в сценариях, подобных этому:

$ cat /etc/rc.local
#!/bin/bash
touch /var/lock/subsys/local
echo "hickory stick" | logger

Теперь при перезагрузке:

$ journalctl -xef
...
Jul 24 20:31:41 centos7 bash[1629]: HISTORY: PID=1629 UID=0 USER=root CMD=journalctl -xe
Jul 24 22:24:00 centos7 logger[1286]: hickory stick
Jul 24 22:24:00 centos7 sshd[1270]: Server listening on 0.0.0.0 port 22.
Jul 24 22:24:00 centos7 sshd[1270]: Server listening on :: port 22.
Jul 24 22:24:00 centos7 systemd[1]: Starting Permit User Sessions...

Там мы видим наше сообщение через logger, которое мы добавили в /etc/rc.local.

Дополнительная информация

loggerочень полезен, и вы можете записывать его в файл, а не через переключатель -f,вы также можете управлять тегом, отображаемым в журналах, с помощью переключателя -t.

$ logger -t "smurfs" hi
$ journalctl -xe | grep smurfs
Jul 24 20:38:24 centos7 smurfs[1764]: hi

Ссылки

0
18.08.2020, 17:25
1 ответ

Я не знаю инструмента, который делает именно то, что вам нужно. Это не означает, что его не существует, но это означает, что вы не можете ожидать найти его на типичном рабочем столе Linux.

Копирование -вставка одного файла с помощью обычных бытовых инструментов

Если вы хотите немного изменить требования, чтобы это не было в точности копией -вырезать -вставить модель, все может быть проще. Одна вещь, которую делает модель копирования -вырезания -вставки, усложняет реализацию и обычно контр-интуитивна для файлов в любом случае, заключается в том, чтобы принять решение о вырезании -против -копирования в точке происхождения.. Для файлов обычно имеет смысл выбирать исходную точку, а копировать или перемещать — в конечную.Если вы выберете этот подход, точке происхождения нужно скопировать только список имен файлов, а не решение о перемещении или копировании.

Копировать имя файла в буфер обмена довольно просто с помощью обычных инструментов:xselилиxclipв X11, pbcopyи pbpasteв macOS. См. Скопировать содержимое файла в буфер обмена без отображения его содержимого и Как прочитать ввод более 4k без новых строк на терминале? . xselи xclipобычно не устанавливаются по умолчанию, но обычно доступны в виде пакетов. Я буду использовать xselв своих примерах, потому что он короче для ввода, а другие инструменты аналогичны. xselна самом деле глючит с большими входными данными, но это не проблема с типичными именами файлов.

В следующих примерах кода предполагается, что имена файлов не заканчиваются символами новой строки.

Для zsh и xsel, вот пример копирования -вставки для одного файла или каталога:

/some/where% xsel <<<$PWD/myfile
/else/where% cp `xsel`.

С bash или ksh вам понадобится несколько двойных кавычек.

/some/where$ xsel <<<"$PWD/myfile"
/else/where$ cp -p "`xsel`".

Обратите внимание, что вставка непосредственно в командную строку не работает, если имя файла содержит специальные символы оболочки.

Работа с несколькими файлами

Самый простой способ работать с несколькими файлами — не работать с несколькими файлами. Если вы хотите скопировать несколько файлов, скопируйте имя (целевого каталога )с целевого терминала и вставьте его в исходный терминал.

/else/where$ xsel <<<"$PWD"
/some/where$ cp -Rp file1 file2 *.more.files "`xsel`"

У меня есть скрипт с именемcfn(c opy f ile n ame ), который по существу копирует свой аргумент с добавлением $PWD/в буфер обмена, но добавляет немного надежности :он поддерживает несколько аргументов, он копирует как в выделение X, так и в буфер обмена, он работает как с абсолютными, так и с относительными именами файлов, он имеет опции для поддержки путей Windows. Его можно было бы улучшить, используя нулевые разделители, и тогда он поддерживал бы новые строки в именах файлов.

#! /bin/sh
# Copy file name

if [ "$#" -eq 0 ] || [ "$1" = "--help" ]; then
  cat <<EOF
Usage: $0 [OPTION]... FILENAME [...]
Copy FILENAME to both the X clipboard and the primary selection.
If FILENAME is relative, prepent \$PWD.
Multiple FILENAMEs are separated by newlines, but no newline is added at the
end.

  -F            Do not add a newline after the last file name (default)
  -f            Do add a newline after the last file name
  -p PREFIX     Prefix to use instead of \$PWD
  -r ROOT       Prefix to use before ROOT
  -s STRING     Separator to use instead of a newline
  -u            Use slash as the path separator (default)
  -w            Use backslash instead of slash as the path separator
EOF
  exit
fi

set -e -f

append=
cwd="$PWD/"
explicit_cwd=
names=
nl='
'
root=
sep='/'

change_separator () {
  if [ -z "$1" ]; then
    eval "$var="
    return
  fi
  IFS=/
  var=$1
  eval "set \$$var; $var=\$1"
  shift
  if [ "$1" != "" ]; then
    set "$@" ""
  fi
  while [ "$#" -ne 0 ]; do
    eval "$var=\$$var\$sep\$1"
    shift
  done
}

while getopts Ffuwp:r:s: OPTLET; do
  case "$OPTLET" in
    F) append=;;
    f) append=1;;
    p) cwd="$OPTARG"; explicit_cwd=1;;
    r) root="$OPTARG";;
    s) nl="$OPTARG";;
    u) sep="/";;
    w) sep="\\";;
    *) echo 1>&2 "$0: unknown option: -$OPTLET"; exit 3;;
  esac
done
shift "$((OPTIND-1))"
if [ -z "$explicit_cwd" ] && [ "$sep" != "/" ]; then
  change_separator cwd
fi

for x do
  case $x in
   .) x=${cwd%"$sep"};;
    [!/]*)
      if [ "$sep" != "/" ]; then
        change_separator x
      fi
      x="$cwd$x";;
    *)
      if [ "$sep" != "/" ]; then
        change_separator x
      fi;;
  esac
  names="$names$root$x$nl"
done
if [ -z "$append" ]; then
  names=${names%"$nl"}
fi
printf %s "$names" | xsel
printf %s "$names" | xsel -b

У меня нет соответствующего сценария вставки; вот как вставить несколько файлов (с именами, разделенными новой строкой -)в zsh.

/else/where% cp -p ${(f)$(xsel)}.

В баш:

/else/where$ readarray -t a < <(xsel) && cp -p "${a[@]}".
0
18.03.2021, 23:12

Теги

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