Как я могу видеть, что точная командная строка выполняется в некотором экземпляре удара?

Использовать "$@".

#!/bin/sh
trickle -u 80 ~/bin/s3cmd.py "$@"

Нет никакого функционального различия между $* и $@ при перенесении неявному разделению слова (почти всегда при закрытии кавычки). При заключении в кавычки, однако, $* единственная строка, разделенная первым символом IFS, и "$@" действительный массив (что Вы хотите).

$ set foo bar baz
$ IFS=c
$ printf '%s\n' "$@"
foo
bar
baz
$ printf '%s\n' "$*"
foocbarcbaz
30
04.10.2014, 02:15
3 ответа

Можно использовать readlink для печати, куда указывает ссылка. Аргумент readlink без параметров должен быть ссылкой, если передать его в файл, он ничего не напечатает. Параметр -f для readlink из пакета coreutils рекурсивно следует по ссылкам и печатает имя файла, даже если аргумент уже является файлом.

Если вы это сделаете ( -n подавляет новую строку в конце вывода readlink ):

dpkg -S "$(readlink -fn "$(which rename)")"

Вы получите ответ:

perl: /usr/bin/prename

в этом случае ссылка будет удалена из prename , но это не гарантировано (например, если ссылка указывала на исполняемый файл rename

Как указано в @ 011c, если он установлен, можно использовать realpath в качестве альтернативы readlink -f

-121--133875-

Они, вероятно, дважды нажимали клавишу TAB для завершения ввода имени файла.

То, что именно вы показываете, немного зависит от оболочки: например, zsh можно настроить так, чтобы показать вам дату и размер файла, и это достаточно умно, чтобы показать вам только каталоги, так как вы не можете cd в файл в любом случае.

Пример вывода bash:

$ cd (tabtab)
dira/     dirb/     file.txt  

Пример вывода zsh после некоторой настройки:

[0 1058 9:52:56] ~/temp/tabtest % cd dir
drwxrwxr-x   2 user   group      4096 Oct 3 09:51 dira
drwxrwxr-x   2 user   group      4096 Oct 3 09:51 dirb

(zsh завершен до dir на первой вкладке, так как невозможно выполнить cd в file.txt.)

-121--157772-

Я знал, что хватаюсь за соломинку, но UNIX никогда не дает сбой!

Вот как мне это удалось:

bash$ gdb --pid 8909
...
Loaded symbols for /lib/i386-linux-gnu/i686/cmov/libnss_files.so.2
0xb76e7424 in __kernel_vsyscall ()

Затем по запросу (gdb) я выполнил команду, вызовите write_history («/tmp/foo ») , который запишет эту историю в файл /tmp/foo .

(gdb) call write_history("/tmp/foo")
$1 = 0

Затем отсоединяюсь от процесса.

(gdb) detach
Detaching from program: /bin/bash, process 8909

И выйдите из gdb .

(gdb) q

И достаточно...

bash$ tail -1 /tmp/foo
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done

Для упрощения повторного использования в будущем я написал сценарий bash , автоматизирующий процесс.

41
27.01.2020, 19:38

Поскольку команда все еще работает на экране, его родительская Bash не перечитает никакой истории, так как:

  • reattach на экран
  • Нажмите ^ z , затем ART AROW
  • Бонус : Оберните команду в одиночных цитатах (навигация с ^ a ^ A - потому что экран (1) - и ^ E ) и ECHO + перенаправляют в файл
  • FG Чтобы преследовать командование казни

, есть предостережения, но это достаточно полезно, большую часть времени.

5
27.01.2020, 19:38

bc , поставляемый с Solaris, является историческим.

Чтобы получить то же чувство bc , что и в Linux, просто установите пакет gbc OpenCSW .

-121--146344-

Перед первым regexp с космосом:

grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

должен сделать трюк, так как он исключает совпадение в начале строки.

Если вы хотите только 4-й столбец, вы можете легко достичь этого с помощью любого GNU sed:

sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'

, где \s - любой символ пробела (космос, tab и различные «каналы» 1 ) и \S - символ, не являющийся пробелом, или (в гораздо более чистом пути) с sed | cut :

sed 's/\s\+/\t/g' | cut -f4

, который сначала сжимает все места в одну закладку, а затем использует вырезание для вырезания четвертого столбца. Это также позволяет легко выбирать большее количество столбцов, например, с помощью cut -f1,4 и т.д.

1) То есть форма подачи, линейная подача, возврат каретки, хотя средняя обычно интерпретируется sed как разделитель линии.

-121--202694-

Я знаю, что вы нашли свой ответ, но есть ли причина, по которой вы не можете сделать что-то подобное:

(set -x; for f in 1 2 3 4 ; do  echo "$f"; sleep $f; done)

Возможно, вы не можете объединить выходные данные фактического задания и выходные данные bash, показывающие текущую выполняемую строку.

Также, FWIW, если вы предпочитаете многословность, установите -o xtrace .

0
27.01.2020, 19:38

Теги

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