Ik “ben vrij nieuw in bash-scripting en het gaat redelijk goed, maar ben een probleem tegengekomen.
Ik probeer een script te maken dat een slash (/) gebruikt, maar ik krijg steeds de foutmelding /: is a directory.
Dus eigenlijk wat Ik moet het commando test/(hello)
doorgeven aan een programma in de terminal. Dus ik heb backslashes toegevoegd om het te laten werken: test\/\(hello\)
, echter Krijg ik deze foutmelding. Wat is hier mis?
Reacties
- waar gebruikt het script de schuine streep? Het klinkt alsof je het argument met succes doorgeeft aan het commando / script, maar dat er een fout in het script zit. Kun je ons een meer gedetailleerd voorbeeld geven? vermeldt het niet ' een regelnummer of zoiets?
Antwoord
Dit mag alleen gebeuren als u niet slaagt voor een commando voor het argument. Je moet commandos als volgt aanroepen:
command [args ...]
Als je het op deze manier aanroept, zal het werken.
$ echo test/\(hello\) test/(hello)
Voor de duidelijkheid, het is over het algemeen veel gemakkelijker (en veel leesbaarder) om argumenten aan te halen in plaats van alle metatekens te laten ontsnappen. U kunt dit doen met "
en "
(er is goede informatie over hier ).
Reacties
- Upvoted. De shell interpreteert tekst die alleen door schuine strepen is gescheiden als mappen, niet als commandos / argumenten. De schuine streep kan worden gebruikt in argumenten van bijvoorbeeld Perl-scripts (vereist het configureren van
Getopt::Long
of het rollen van uw eigen), maar vereist nog steeds de ruimte tussen het commando en de argumenten – nogmaals, dit is een shell-vereiste.
Answer
Als je de exacte string moet doorgeven test/(hello)
naar een programma, plaats het tussen enkele aanhalingstekens:
someprogram "test/(hello)"
Elk teken wordt letterlijk geïnterpreteerd tussen enkele aanhalingstekens, behalve het enkele aanhalingsteken zelf. Als je een enkel aanhalingsteken nodig hebt in de string, geef het dan door als "\""
(letterlijke tekenreeks aan het einde, volgende teken aanhalingsteken, enkel aanhalingsteken letterlijk geïnterpreteerd, letterlijke beginreeks).
echo "Lasciate ogne speranza, voi ch"\""entrate"
Dit staat niet in verband met de foutmelding die u hier laat zien. /: is a directory
betekent dat je hebt geprobeerd /
uit te voeren als een programma. Er is vermoedelijk een plaats waar u probeerde het volledige pad naar een programma te schrijven, maar een extra spatie heeft gelaten, zoals in
/ path/to/program
Er kunnen andere interpunctie-tekens zijn dit minder voor de hand liggende, of controletekens in dat bericht. Om foutopsporing te vergemakkelijken, plaatst u set -x
op de tweede regel van het script, net na de eerste regel #!
, zodat de shell een trace van elke regel die het uitvoert.