Het probleem is dat de shell met onder andere de volgende tekens of
tekenreeksen gaat lopen:
( ) [ ] { } $ \ " ' * ? < > & || && ;; ; |
Deze tekens worden allemaal door de shell voor speciale tekens aanzien:
De shell expandeert deze karakters altijd, voor eender welk argument, tenzij er
geen bestand is dat aan de wildcards voldoet. Een programma krijgt dus nooit
een “*” teken te zien, maar altijd hetgeen de shell daarvoor invult. Wens je
de tekens te behouden dan kan je ze escapen door er een backslash voor te
zetten (bv. \* voor een letterlijke “*”). De shell doet die backslash
weer weg. Je kan ook je hele argument tussen enkele aanhalingstekens zetten.
(bv ’be*?’ om deze tekens letterlijk mee te geven). Wat er dus
gebeurde met \[bla\] was dat dit aan het programma werd meegegeven als
[bla].
Je kan altijd checken wat de shell doet door
~$ echo be*
in te typen, of
~$ echo \[bla\]
Een ook vaak voorkomend probleem zijn bestandsnamen die beginnen met een
-: het programma zal deze interpreteren als programma-optie. Om dit te
vermijden moet je duidelijk maken dat je geen programma-opties meer zal
gebruiken. Dit doe je door -- na al je argumenten te zetten.
Een voorbeeld:
-foo
rm -foo
rm -- -foo