Если вы выполнили все, например, 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
Я не знаю инструмента, который делает именно то, что вам нужно. Это не означает, что его не существует, но это означает, что вы не можете ожидать найти его на типичном рабочем столе 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[@]}".