Haal de laatste bash-opdracht inclusief pijpen

Ik heb een script geschreven dat de opdracht run ophaalt met $ BASH_COMMAND. Het script doet fundamenteel wat logica om erachter te komen welk commando en bestand voor elke tmux-sessie wordt geopend. Alles werkt geweldig, behalve wanneer de gebruiker een piped-opdracht uitvoert (bijv. cat file | less ), in welk geval $ BASH_COMMAND alleen de eerste opdracht vóór de pipe lijkt op te slaan. Als een resultaat, in plaats van het tonen van de opdracht als minder [bestand] (wat het eigenlijke programma is dat het bestand open heeft), voert het script het uit als cat [bestand] .

Een alternatief dat ik probeerde te gebruiken, is vertrouwen op geschiedenis 1 in plaats van $ BASH_COMMAND. Er zijn ook een aantal problemen met dit alternatief. Ten eerste worden Aliassen niet automatisch uitgebreid, zoals $ BASH_COMMAND, wat in sommige gevallen ertoe kan leiden dat het script in de war raakt (bijvoorbeeld als ik zeg dat het ls moet negeren, maar gebruik ll in plaats daarvan (toegewezen aan ls -l ), zal het script de opdracht niet negeren en toch verwerken), en het toevoegen van extra conditionals voor elke alias lijkt geen schone oplossing. Het tweede probleem is dat ik HISTIGNORE gebruik om enkele veelvoorkomende opdrachten uit te filteren, waarvan ik nog steeds wil dat het script hiervan op de hoogte is. Door het gebruik van de geschiedenis zal het script het laatste commando negeren, tenzij het wordt gevolgd door de geschiedenis.

Ik heb ook geprobeerd om $ {# PIPESTATUS [@]} te gebruiken om te zien of de arraylengte 1 (geen pipes) of hoger is (gebruikte pipes, in welk geval ik de geschiedenis zou ophalen), maar lijkt zich ook altijd bewust te zijn van 1 opdracht.

Is iemand op de hoogte van andere alternatieven die voor mij zouden kunnen werken (zoals een andere variabele die $ BASH_COMMAND zou opslaan voor de andere subcalls die moeten worden uitgevoerd nadat de huidige suboproep is voltooid, of een manier om op de hoogte te zijn als de pijp werd gebruikt in de laatste commando)?

2
Eén nitpick: minder (1) heeft het bestand niet echt geopend. kat (1) doet. minder (1) heeft de inhoud van een anonieme pijp geopend; de pijp werd geconstrueerd met pijp (2) .
toegevoegd de auteur sarnold, de bron
dit is een slecht bedacht idee, ik betwijfel ten zeerste of je het op de juiste manier uit de shell kunt implementeren. heb je lsof geprobeerd?
toegevoegd de auteur Samus_, de bron

1 antwoord

ik denk dat je een beetje van je implementatie moet veranderen en het "history" commando moet gebruiken om het te laten werken. Gebruik ook de opdracht "alias" om alle geconfigureerde alias te controleren .. de opdracht "which" om te controleren of de opdracht daadwerkelijk in een willekeurige PATH-map is opgeslagen. succes

1
toegevoegd
Dit werkte voor mij: LAST_CMD = $ (geschiedenis 1 | head -n1 | cut -c 8 -)
toegevoegd de auteur saeedgnu, de bron