bash autocomplete... for feinschmeckere

Ok, jeg indrømmer det. Jeg har anvendt tcsh i mange år på mine Linux-maskiner, men er lidt ked af at tcsh er udviklingsmæssigt sten-død. Derfor har jeg anvendt bash et stykke tid, og er naturligvis hurtigt kommet over forskellene med f.eks. "setenv sandheden 42" i tcsh og "export sandheden=42" i bash.
Scripting-mæssigt er der også masser af forskelle, men fred være med det. Pt. er der to ting med bash, som irriterer mig, som jeg har bikset med lidt for længe - og derfor blogger jeg om løsningen.

Lad os lige lave et eksempel:

$ export STORAGE=/backup
$ mkdir -p $STORAGE/a/b/c

Dermed har vi et katalog /backup/a/b/c

På Red Hat Linux er der i modsætning til Ubuntu sat op at man kan taste tabulator efter en variabel og dermed bliver denne ekspanderet.

$ cd $STORAGE

bliver til

$ cd /backup

hvor cursoren står med et mellemrum efter "/backup". Det er ret dumt, at man får et mellemrum efter ekspanderingen er lavet, da jeg ofte vil tilføje flere og flere dele af den fulde sti ned i et katalog-hierarki.

En anden ting er at auto-ekspandering af variable måske ikke er så fedt, og derfor vil jeg nok droppe dette.
Dette forstår jeg nu efter at have kigget på de 458 complete-regler som Ubuntu 10.10 har. På Red Hat kan jeg droppe ekspandering med:

$ complete -o filenames -F _longopt expand
$ complete -o filenames -F _longopt unexpand

På Red Hat Linux ender jeg hver gang med at trykke på backspace efter tab for at slette mellemrum efter ekspandering.
Det tog mig lidt en del tid før jeg forstod, hvordan jeg kunne fikse dette

$ complete -o nospace cd

Egentlig har Ubuntu reglen således "complete -o nospace -F _cd cd" men "_cd" er ikke kendt på Red Hat. Jeg forstår ikke hvor bash gemmer de regler...

Min bitre erfaring er at bash auto-complete RPM pakken til Red Hat er totalt defekt. Bla. virker SSH login ikke når den er installeret...

Er der nogen af jer som har forstået hvad man kan med /etc/bash_completion ''

En ting jeg endnu ikke kan er at kunne skrive

$ cd $STORAGE/

og automatisk få appended underkataloget "a" da dette var det eneste under "/backup" - og var der flere ville jeg have vist dem. Nogen af jer som magter dette - uden at der laves ekspandering af $STORAGE?

/pto

Kommentarer (16)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
#7 Peter Holm Jensen

ja så kræver bash altid et par forsøg før det virker, for hvordan er det nu "" skal stå hvis der er spacer i variablen, man skal vist skrive bash scripter hver dag for at blive en haj, til gengæld er man nød til at kunne lidt bash for det er altid den shell man møder alle vegne... bliver det for langhåret forfalder jeg til python og et python program kan jo altid kaldes fra et bash script hvis ellers man man kan finde ud at få parametrene med over ;-)

  • 0
  • 0
#8 Lars Tørnes Hansen

Nogle links fra webup8.org's CLI sektion

"Script To Manage A Lot Of Linux Servers Through SSH": http://www.webupd8.org/2010/09/script-to-easily-manage-lot-of-linux.html

"Copy / Paste Files From The Command Line [Bash Alias]": http://www.webupd8.org/2010/10/copy-paste-files-from-command-line-bash.html

"Download The Ultimate Bashrc File"

The Ultimate Bashrc is a custom .bashrc file that comes with tons of aliases, functions and bash settings, all in one file. Here are a few examples: various bash prompts, sudo for entire line, apt history, various conversion functions like temperature, currency (based on Google) and so on, rip audio from video, bookmarks directories, copy/paste for the command line, convert any video to avi, cp with progress bar, translate a word using Google, Deb Extraction / Remaker (extracts a deb file & organizes for easy deb manipulation and repacking using "debremaker"), a "del" alias that moves the files to trash instead of removing them completely, a "site down for everyone or is it just me" function, various computer info and many more.

While you probably won't need everything in this custom bashrc file, I'm sure you'll find some very useful functions that you can use so go ahead and take a look - everything is very well organized and documented so it should be pretty easy to figure what everything does and what's required to get it to work.

er sakset fra http://www.webupd8.org/2011/01/download-ultimate-bashrc-file.html

og Download link er: http://gnome-look.org/content/show.php/Ultimate+Bashrc+File?content=129746

ubuntudanmark.dk/forum > Sandkassen:

Jeg bemærker at "Ultimate bashrc file" herover også indeholder "Thw patch that does wonders" som bash shell script - som virker perfekt, og virkelig rykker på desktops. I kan finde scriptet i et indlæg i Sandkassen på ubuntudanmark.dk/forum

Kernelcheck Lumen - til at lave en ny custum kerne på Debian systemer - ordner en masse ting automatisk. Jeg har et indlæg i Sandkassen på ubuntudanmark.dk/forum

  • 0
  • 0
#10 Deleted User

Standard-bindingen i bash for Ctrl-W også grænseløst irriterende i bash, når man kommer fra tcsh. I tcsh slettes forgående ord til et mellemrum eller "/", men i bash kun til mellemrum, så hele ens filsti forsvinder!

Igen er det Readline-konfigurationen (.inputrc), som man skal have fingre i.

c-w: unix-filename-rubout

Der er flere muligheder. Se http://www.gnu.org/software/bash/manual/bashref.html for alle muligheder.

  • 0
  • 0
#15 Deleted User

Mystisk. Nu kender jeg desværre ikke Red Hat, men kunne det mon være, fordi de sætter INPUTRC=/etc/inputrc inde i /etc/profile? I så tilfælde skal man lige redigere en linje, kigge i /etc/inputrc og finde ud af, hvad der sker, eller måske simpelthen

export INPUTRC="~/.inputrc"

i sin egen .bash_profile og begynde på en frisk derfra. Det kan ofte være lettere.

Det kan også lade sig gøre at eksperimentere fra kommandolinjen af med bind-kommandoen, fx

bind '"\C-w": unix-filename-rubout'

Husk enkelte og dobbelte citations-tegn. Man burde også kunne bruge

bind 'Control-w: unix-filename-rubout'

Kig evt. på den nødtørftige hjælp med

help bind

Det kan måske hjælpe at se med bind -v, hvad der er sat ved login. Der er også fuldt færdige keymaps til at komme hurtigt i gang, fx bind -m emacs, og så have ændringerne derfra. Der er flere keymaps-varianter af emacs- og vi-bindinger at vælge imellem, samt en editing-mode, bare for at krydre mulighederne. Man kan nøjes med meget lidt bare ved at begynde med en keymap, som matcher ens behov bedst.

Du kan sådan set helt droppe at have en ~/.inputrc og så bruge set -o emacs efterfulgt af håndfuld bind-kommandoer i .bash_profile eller .bashrc.

Hvis det er i en xterm, så blander xmodmap sig også i sagerne, og rxvt(-unicode) gør igen tingene på sin helt egen måde, og så er der selvfølgelig terminfo og termcap :-)

  • 0
  • 0
Log ind eller Opret konto for at kommentere