Skript som gör alias av senaste kommando…
Postat: 27 feb 2012, 23:10
Hade en idé om att göra ett enkelt skript (bash) som gör följande:
Plockar fram senaste kommandot (eller näst senaste, eftersom det senaste förmodligen är körandet av själva skriptet) från ~/.bash_history, gör ett alias av det och placerar alias-kommandot sist i filen ~/.bash-aliases – en fil som jag anropar från ~/.bashrc.
Men jag stötte på patrull efter patrull.
Först upptäckte jag att kommandot history inte funkar i ett skript; det returnerar ingenting då.
Okej, inga problem, jag tittar istället direkt i ~/.bash_history. Nehej, det gick inte, för den är sällan aktuell; det fattas oftast några tiotal rader där, så det verkar som att den samlar på sig kommandon och lägger in dem klumpvis i filen.
Men okej, det gick tydligen att åtgärda genom att skriva några väl valda rader i sin ~/.bashrc-fil, men det känns ju lite ”så där” att man ska behöva ha sitt system specialkonfigurerat för att ett visst skript ska fungera.
Så fick jag en annan idé, nämligen att användaren själv kan mata in senaste kommandot som argument till skriptet. Låter ju jobbigt, men det är ju väldigt enkelt tack vare ”!!” som ju expanderas till senaste kommandot automatiskt.
Jaha ja, vad bra, då. Så jag börjar skriva på lite i all min okunnighet, men stöter åter på patrull.
Lättast att visa med ett exempel.
Jag kanske vill göra ett alias för att ta mig till en speciell mapp som ligger ett antal nivåer neråt. Manuellt kanske man skriver:
cd "/home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till"
Man kan givetvis också skriva:
cd /home/jag/min\ fina/mapp\ som\ tar/en\ stund/att/skriva/sökvägen\ till
Problemet är ju att om man väljer första skrivsättet så förvinner citat-tecknen och om man väljer andra skrivsättet så försvinner bakåtsnedstrecken när väl texten tagits in till skriptet i form av argument eller parametrar eller vad man kallar det!
Jag kom inte på något enkelt sätt att komma runt detta, i alla fall inte om användaren ska förväntas kunna mata in i princip vad som helst.
Är det bara ”cd sökväg” som väntas är det ju enkelt att låta skriptet ”manuellt” placera ut dubbelfnuttarna på rätt ställen, men det är kanske inte så ofta som det är så enkelt.
Någon som har några idéer?
Så här hade jag tänk mig att det hela skulle fungera:
Användaren kör ett kommando och kommer på att han vill ha det som ett alias, eftersom han kommer att utföra det ganska ofta. Det kan vara vad som helst, men låt oss hålla oss till det enkla:
cd "/home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till"
Ett skript som heter ”pa” (permanent alias…) ska fixa biffen om man kör det direkt efter föregående kommando:
pa xyz !!
Bash expanderar detta till:
pa xyz cd "/home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till"
Skriptet ska sedan sätta ihop detta till ett alias-kommando:
alias xyz='cd "/home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till"' som sedan ska läggas på slutet av ~/.bash-aliases, så att aliaset kommer att fungera permanent.
Istället blir det:
alias xyz='cd /home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till'
vilket inte leder längre än till ett felmeddelande, eftersom mellanslagen tjänstgör som separator mellan parametrar till cd-kommandot.
Någon som kommer på något enkelt sätt att komma runt detta lilla mini-problem? Förutom att användaren själv skriver ”\\” istället för ”\” eller ”\"” istället för ”"”, förstås…
Visst kan man analysera varje ord och lista ut vad som är sökvägar och inte, men det känns som ett lite större projekt än vad jag hade tänkt mig, vilket enbart kommer att resultera i att det rinner ut i sanden.
Funderar också på om det blir annorlunda om jag väljer att göra det i C istället (mest på grund av att jag inte kan något annat, och knappt det ens), men jag misstänker att det inte spelar någon roll.
Som sagt, idéer är välkomna.
Plockar fram senaste kommandot (eller näst senaste, eftersom det senaste förmodligen är körandet av själva skriptet) från ~/.bash_history, gör ett alias av det och placerar alias-kommandot sist i filen ~/.bash-aliases – en fil som jag anropar från ~/.bashrc.
Men jag stötte på patrull efter patrull.
Först upptäckte jag att kommandot history inte funkar i ett skript; det returnerar ingenting då.
Okej, inga problem, jag tittar istället direkt i ~/.bash_history. Nehej, det gick inte, för den är sällan aktuell; det fattas oftast några tiotal rader där, så det verkar som att den samlar på sig kommandon och lägger in dem klumpvis i filen.
Men okej, det gick tydligen att åtgärda genom att skriva några väl valda rader i sin ~/.bashrc-fil, men det känns ju lite ”så där” att man ska behöva ha sitt system specialkonfigurerat för att ett visst skript ska fungera.
Så fick jag en annan idé, nämligen att användaren själv kan mata in senaste kommandot som argument till skriptet. Låter ju jobbigt, men det är ju väldigt enkelt tack vare ”!!” som ju expanderas till senaste kommandot automatiskt.
Jaha ja, vad bra, då. Så jag börjar skriva på lite i all min okunnighet, men stöter åter på patrull.
Lättast att visa med ett exempel.
Jag kanske vill göra ett alias för att ta mig till en speciell mapp som ligger ett antal nivåer neråt. Manuellt kanske man skriver:
cd "/home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till"
Man kan givetvis också skriva:
cd /home/jag/min\ fina/mapp\ som\ tar/en\ stund/att/skriva/sökvägen\ till
Problemet är ju att om man väljer första skrivsättet så förvinner citat-tecknen och om man väljer andra skrivsättet så försvinner bakåtsnedstrecken när väl texten tagits in till skriptet i form av argument eller parametrar eller vad man kallar det!
Jag kom inte på något enkelt sätt att komma runt detta, i alla fall inte om användaren ska förväntas kunna mata in i princip vad som helst.
Är det bara ”cd sökväg” som väntas är det ju enkelt att låta skriptet ”manuellt” placera ut dubbelfnuttarna på rätt ställen, men det är kanske inte så ofta som det är så enkelt.
Någon som har några idéer?
Så här hade jag tänk mig att det hela skulle fungera:
Användaren kör ett kommando och kommer på att han vill ha det som ett alias, eftersom han kommer att utföra det ganska ofta. Det kan vara vad som helst, men låt oss hålla oss till det enkla:
cd "/home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till"
Ett skript som heter ”pa” (permanent alias…) ska fixa biffen om man kör det direkt efter föregående kommando:
pa xyz !!
Bash expanderar detta till:
pa xyz cd "/home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till"
Skriptet ska sedan sätta ihop detta till ett alias-kommando:
alias xyz='cd "/home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till"' som sedan ska läggas på slutet av ~/.bash-aliases, så att aliaset kommer att fungera permanent.
Istället blir det:
alias xyz='cd /home/jag/min fina/mapp som tar/en stund/att/skriva/sökvägen till'
vilket inte leder längre än till ett felmeddelande, eftersom mellanslagen tjänstgör som separator mellan parametrar till cd-kommandot.
Någon som kommer på något enkelt sätt att komma runt detta lilla mini-problem? Förutom att användaren själv skriver ”\\” istället för ”\” eller ”\"” istället för ”"”, förstås…
Visst kan man analysera varje ord och lista ut vad som är sökvägar och inte, men det känns som ett lite större projekt än vad jag hade tänkt mig, vilket enbart kommer att resultera i att det rinner ut i sanden.
Funderar också på om det blir annorlunda om jag väljer att göra det i C istället (mest på grund av att jag inte kan något annat, och knappt det ens), men jag misstänker att det inte spelar någon roll.
Som sagt, idéer är välkomna.