• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Autovervollständigung ohne [ \ ] in bash = Problem mit Sonderzeichen

A

Anonymous

Gast
Hi,
in openSUSE 13.2 klappt in der Konsole (bash) die Autovervollständigung nicht mehr richtig.

Bei allen Sonderzeichen im Dateinamen (Leerstelle, Klammer, Doppelpunkt) wird beim Drücken auf die [Tabulator]-Taste eine Datei nur noch ohne den notwendigen Backslash [ \ ] dargestellt.
Code:
ls Mitternachtskrimi*
Mitternachtskrimi - DLF(ZDFvision) - Sa 05 Dez 2015 00:04:00 CET.mpeg
Mitternachtskrimi - DLF(ZDFvision) - Sa 05 Sep 2015 00:00:00 CEST.mpeg
Mitternachtskrimi - DLF(ZDFvision) - Sa 12 Dez 2015 00:04:00 CET.mpeg
Mitternachtskrimi - DLF(ZDFvision) - Sa 19 Dez 2015 00:04:00 CET.mpeg
Mitternachtskrimi - DLF(ZDFvision) - Sa 26 Dez 2015 00:04:00 CET.mpeg
Dann will ich eine Datei davon bearbeiten und tippe ein:
Code:
ffmpeg Mitternachtskrimi\
und bekomme nach Drücken auf die [Tabulator]-Taste als Autovervollständigung
ffmpeg Mitternachtskrimi - DLF(ZDFvision) - Sa
Wenn ich jetzt den restlichen Dateinamen ergänzen will klappt das nicht mehr!
Ich muss mit den Pfeiltasten zurückgehen und überall von Hand den Backslash [ \ ] einfügen bis da steht:
Code:
ffmpeg Mitternachtskrimi\ -\ DLF\(ZDFvision\)\ -\ Sa\ 12\ D
und bekomme nach Drücken auf die [Tabulator]-Taste als Autovervollständigung meine gewünschte Datei:
ffmpeg Mitternachtskrimi - DLF(ZDFvision) - Sa 05 Dez 2015 00:04:00 CET.mpeg
Wenn ich dann ENTER drücke kommt eine Fehlermeldung:
bash: Syntaxfehler beim unerwarteten Wort `('
In openSUSE 13.1 wurde bei Sonderzeichen der Backslash [ \ ] bei der Autovervollständigung immer mit eingefügt.
Das sah dann so aus:
ffmpeg Mitternachtskrimi\ -\ DLF\(ZDFvision\)\ -\ Sa\ 12\ Dez\ 2015\ 00\:04\:00 CET.mpeg
Von dem Problem sind alle Programme und Komandos betroffen, also auch gcc, nano, ls, grep usw.
openSUSE 13.2 ist eine Neuinstallation.
Wie kann ich die Autovervollständigung wieder umstellen auf die Variante in openSUSE 13.1?

Kann mir jemand bitte weiterhelfen?
 

spoensche

Moderator
Teammitglied
Welche User verwenden unter Linux den Leerzeichen im Dateinamen?

Ich persönlich bin da eher der Freund vom "_" oder "-".
 

josef-wien

Ultimate Guru
Deine Frage kann ich nicht beantworten, aber openSUSE scheint sehr exzessiven Gebrauch von der programmable bash completion zu machen, wie Dir
Code:
complete -p
zeigt, und da könnte sich bei 13.2 etwas eingeschlichen haben (bei PCLinuxOS kommt genau nichts heraus, dort begnügt man sich mit der basic bash completion).

P. S. Bei weitgehend gleichen Dateinamen würde ich mit kopieren und einfügen arbeiten und die Dateinamen unter Anführungszeichen setzen.
 

Boreas

Member
Natürlich haben meine Vorredner recht. Aber zu Deinem Problem - bei mir funktioniert alles wie Du es Dir wünscht. Ich vermute Deine
bash-Konfiguration ist irgendwie nicht mehr i.O.?
GNU bash, Version 4.2.53(1)-release (x86_64-suse-linux-gnu)
openSUSE 13.2, linux 3.16.7-29-desktop #1 SMP PREEMPT Fri Oct 23 00:46:04 UTC 2015 (6be6a97) x86_64 x86_64 x86_64 GNU/Linux
Versuch es doch mal mit einem anderen Nutzer.
 
Ich habe hier kein suse, aber normalerweise solltest Du mal in "/etc/bash.bashrc" gucken ob completion aktiviert ist (sprich Kommentarzeichen vor den entsprechenden Zeilen weg sind). Darin findet sich auch der Link auf bash_completion, welcher, wenn Du in die Datei reinguckst, vermutlich mit einem Punkt anfängt und dann auf eine Datei unterhalb /usr/ verweist. Existiert diese Datei auch wirklich? Als allererstes kannst Du aber mal gucken ob bash-completion überhaupt installiert ist. rpm -qa | grep bash sollte dir das anzeigen. Danach evtl. mit zypper oder so mal gucken welche Version und ob es da etwas neueres gibt. Du darfst auch mal gucken ob unterhalb von /etc/bash_completion.d noch Dateien liegen.

Ganz im Zweifel bash-completion komplett purgen und neu installieren. Good luck
 

josef-wien

Ultimate Guru
Geier0815 schrieb:
Ganz im Zweifel bash-completion komplett purgen und neu installieren.
Falls das Paket installiert ist, dann dazwischen schauen, ob es funktioniert (die Autovervollständigung an sich ist eine Basis-Funktion, die mit "Programmen" erweiterbar ist).
 

abgdf

Guru
Ich hatte übrigens auf 12.1 auch schon mal Probleme mit einer von den Entwicklern verschlimmbesserten bash-Version: Wenn man z.B. "echo $HOME/" eingab, und dann TAB drückte, wurde die Variable nicht expandiert, sondern ein Backslash vor das $-Zeichen gemacht, was natürlich total sinnwidrig ist.
Mußte viel recherchieren und schließlich bash neu (und anders) kompilieren. Oder das wurde in einer neueren Version wieder behoben, weiß nicht mehr. Mußte jedenfalls 'ne andere bash-Version draufspielen als die originale von der 12.1.
Sowas Dummes, seit Urzeiten (10.0, 8.0) war das doch schonmal richtig.
Sowas gibt's also.
 
OP
A

Anonymous

Gast
Danke für die vielen Hinweise (auch auf mv was aber genauso nicht klappt, gleiche Fehlermeldung wie oben ;) )

ich vermute auch einen Installationsfehler. Irgend ein RPM-Paket ist buggy!
In meiner QEMU-VM mit openSUSE 13.2 (habe zum Glück noch nicht gelöscht) ist alles normal.
bash und bash-completion sind originale Pakete vom Haupt-Repository (OSS).

Zwei PCs und genau gleicher Fehler! Meiner und der von meiner besten Freundin. Haben wir beide jeweils gemeinsam installiert.

Datei: /etc/bash.bashrc ab Zeile 261, da gibts noch einiges zum Nachschauen für mich. Guter Tipp! :thumbs:
Code:
    #
    # Expert mode: if we find $HOME/.bash.expert we skip our settings
    # used for interactive completion and read in the expert file.
    #
    if test "$is" = "bash" -a -r $HOME/.bash.expert ; then
        . $HOME/.bash.expert
    elif test "$is" = "bash" ; then
        # Complete builtin of the bash 2.0 and higher
        case "$BASH_VERSION" in
        [2-9].*)
            if test -e /etc/bash_completion ; then
                . /etc/bash_completion
            elif test -s /etc/profile.d/bash_completion.sh ; then
                . /etc/profile.d/bash_completion.sh
            elif test -s /etc/profile.d/complete.bash ; then
                . /etc/profile.d/complete.bash
            fi
            for s in /etc/bash_completion.d/*.sh ; do
                test -r $s && . $s
            done
            if test -e $HOME/.bash_completion ; then
                . $HOME/.bash_completion
            fi
            if test -f /etc/bash_command_not_found ; then
                . /etc/bash_command_not_found
            fi
            ;;
        *)  ;;
        esac
    fi

Und hier ist die Kakerlake:
kakerlake-kuechenschabe-schabe104~_v-img__16__9__s_-c5778da7d22a9093bc56c736026ee78c16090833.jpg

Code:
ll /etc/bash_completion.d/
total 76
lrwxrwxrwx 1 root root    46 Jan 9 09:37 acroread.sh -> /opt/Adobe/Reader9/Resource/Shell/acroread_tab
-rw-r--r-- 1 root root   561 Oct  6  2014 dbus-bash-completion.sh
-rw-r--r-- 1 root root  3546 Nov 11 08:21 dracut
-rw-r--r-- 1 root root 11158 Dec 24 01:31 grub
-rw-r--r-- 1 root root  6488 Aug  4 16:42 libreoffice.sh
-rw-r--r-- 1 root root  2095 Nov 11 08:21 lsinitrd
-rw-r--r-- 1 root root  6486 Aug  4 16:42 ooffice.sh
-rw-r--r-- 1 root root 15593 Apr 22  2015 pulseaudio-bash-completion.sh
-rw-r--r-- 1 root root  3086 Oct  8  2014 scout.sh
-rw-r--r-- 1 root root   557 Oct  8  2014 tuned.bash
-rw-r--r-- 1 root root  3532 Feb 12  2015 yast2-completion.sh
-rw-r--r-- 1 root root  3672 Nov 19 13:31 zypper.sh
Den Link /etc/bash_completion.d/acroread.sh -> /opt/Adobe/Reader9/Resource/Shell/acroread_tab entfernen.
Ist nicht mehr kompatibel zu openSUSE 13.2.
Steht in der Datei irgendwas wichtiges drin?
Code:
# _filedir : to handle file and directories with spaces in their names.

_filedir()
{
	local IFS=$'\t\n' xspec #glob

	#glob=$(set +o|grep noglob) # save glob setting.
	#set -f		 # disable pathname expansion (globbing)

	xspec=${1:+"!*.$1"}	# set only if glob passed in as $1
	COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -f -X "$xspec" -- "$cur" ) \
		    $( compgen -d -- "$cur" ) )
	#eval "$glob"    # restore glob setting.
}

_acroread()
{
  	local cur prev opts files
	COMPREPLY=()
	cur="${COMP_WORDS[COMP_CWORD]}"
	#prev="${COMP_WORDS[COMP_CWORD-1]}"
	first="${COMP_WORDS[1]}"
	#
	#  The basic options we'll complete.
	#
	opts="--display --screen --sync -geometry -help -man -iconic -setenv -tempFile -tempFileTitle -toPostScript -openInNewWindow -installCertificate -v -version"

	#
	#  Complete the arguments to some of the basic commands.
	#
	case "${first}" in
	-toPostScript)
	if [[ "${cur}" == -* ]]; then
	local running="-binary -start -end -pairs -optimizeForSpeed -landscape -reverse -odd -even -commentsOff -annotsOff -stampsOff -markupsOn -level2 -level3 -printerhalftones -saveVM -size -shrink  -expand -transQuality -printerName -nUp -booklet -rotateAndCenter -choosePaperByPDFPageSize"
	COMPREPLY=( $(compgen -W "${running}" -- "${cur}") )
	return 0
	fi
	;;

	-installCertificate)
	if [[ "${cur}" == -* ]]; then
	  if [ $COMP_CWORD -eq 2 ]; then
	    local running="-PEM -DER"
	    COMPREPLY=( $(compgen -W "${running}" -- "${cur}") )
	    return 0
	  fi
	fi
	;;

	*)
	;;
	esac


	if [[ "${cur}" == -* ]] ; then
	  COMPREPLY=($(compgen -W "${opts}" -- "${cur}"))  
	  return 0
	fi

	if [ $COMP_CWORD -eq 1 -o "${COMPREPLY+set}" != "set" ]; then
        _filedir '[pP][dD][fF]'
	fi

}
complete -o filenames -o nospace -F _acroread acroread
AdobeReader für Linux ftp://ftp.adobe.com/pub/adobe/reader/unix/9.x/9.5.5/enu/

Danke an Geier0815! :)
lg
LUH 3417
 
Oben