Получить последнюю команду bash, включая трубы

Я написал сценарий, который извлекает текущую команду, используя $ BASH_COMMAND. Скрипт в основном выполняет некоторую логику, чтобы определить текущую команду и файл, открываемые для каждого сеанса tmux. Все работает отлично, за исключением случаев, когда пользователь запускает команду с конвейером (т. Е. cat file | less ), и в этом случае $ BASH_COMMAND только сохраняет первую команду перед трубой. В результате вместо показа команды less [file] (которая является реальной программой, в которой файл открыт), сценарий выводит его как cat [file] ,

Одна из альтернатив, которую я пробовал использовать, опирается на history 1 вместо $ BASH_COMMAND. Есть пара проблем с этой альтернативой, а также. Во-первых, он не автоматически расширяет псевдонимы, например $ BASH_COMMAND, что в некоторых случаях может привести к запутанности скрипта (например, если я скажу ему игнорировать ls ), но используйте ll вместо этого (отображается на ls -l ), сценарий не будет игнорировать команду, обрабатывая ее в любом случае), и включая дополнительные условные обозначения для каждого псевдонима не кажется чистым решением. Вторая проблема заключается в том, что я использую HISTIGNORE для фильтрации некоторых распространенных команд, о которых я все еще хочу, чтобы сценарий знал, используя историю, просто заставит скрипт игнорировать последнюю команду, если она не отслеживается историей.

Я также попытался использовать $ {# PIPESTATUS [@]} , чтобы узнать, равна ли длина массива 1 (без труб) или выше (используются трубы, в этом случае я бы взял историю), но это Кажется, что всегда нужно знать только об одной команде.

Кто-нибудь знает о других альтернативах, которые могут работать для меня (например, другая переменная, которая будет хранить $ BASH_COMMAND для других подколов, которые должны быть выполнены после завершения текущего подкала, или каким-то образом знать, был ли канал использован в последняя команда)?

2
Один nitpick: less (1) фактически не имеет открытого файла. cat (1) делает. less (1) содержит содержимое анонимного канала; труба была сконструирована с помощью pipe (2) .
добавлено автор sarnold, источник
это непродуманная идея, я очень сомневаюсь, что вы сможете правильно ее реализовать из оболочки. вы пробовали lsof ?
добавлено автор Samus_, источник

1 ответы

я думаю, что вам нужно немного изменить свою реализацию и использовать команду «история», чтобы заставить ее работать. Кроме того, используйте команду «alias», чтобы проверить все настроенные псевдонимы. Команда «who», чтобы проверить, действительно ли команда хранится в любом каталоге PATH. удачи

1
добавлено
Это сработало для меня: LAST_CMD = $ (история 1 | head -n1 | cut -c 8 -)
добавлено автор saeedgnu, источник
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.