2011-06-11 3 views
1

C'est une question vraiment ignorante, à mon avis, mais ça m'embête vraiment. J'écris un simple shell en C et je veux implémenter l'entrée de l'utilisateur de la même manière que les autres shells, ou du moins comment bash fait (jamais utilisé d'autres). Si vous entrez une commande avec des espaces aléatoires alors il peut toujours exécuter la commande:Préparer une entrée pour un shell

ex.

  ls        -1 

Il est évident que strtok() ne fonctionnera pas sur ce lors de la séparation de la commande et args ...

Comment bash faire cela? Dois-je chercher parmi les milliers de lignes du code source?

Merci

+0

Il peut ne pas la façon dont vous voulez le faire, mais ce qui vous fait penser strtok ne fonctionnerait pas? – Duck

+0

@Duck Parce que je devrais utiliser un espace pour un délimiteur et il produit des erreurs quand il y a des espaces l'un à côté de l'autre ou au début –

+0

@Trevor Arjesk, vous devriez probablement jeter un oeil à la source de getopt, getopt_long, etc – Duck

Répondre

2

Vous pouvez sauter des espaces pendant que vous êtes votre commande: analyse syntaxique

while(*p==' '||*p=='\t') ++p; 
+0

ouais c'est exactement ce que j'ai en ce moment. Est-ce la façon la plus pratiquée? –

+0

En fait, que se passe-t-il si les arguments contiennent des espaces entre guillemets? Une faille dans cette méthode –

+0

Je ne vois pas de défaut, vous n'appelez que la méthode de l'espace entre les arguments, la méthode d'extraction de chaîne de citation sait lire les espaces. – Blindy

0

ne sont pas des espaces blancs problème. Vous pouvez supprimer tout espace qui n'est pas necesery. Mais je ne suis pas sûr que cette coquille le fasse de cette façon. Je pense que shell peut rechercher toute option dans une chaîne qui est entrée. Exemple

ls -a -l and  ls -l -a 

est la même. Peut-être que ce sera mieux si vous recherchez toutes les options possibles, ou interprétez tous les caractères étape par étape. Exemple, tout d'abord rechercher tous "-", après l'option d'interprétation qui est après "-"

+0

'ls -a -l' et' ls -l -a' ne sont identiques que parce que 'ls' les gère de la même façon. Ils ne sont certainement pas les mêmes pour le shell (ie dans le premier cas, il mettra 'ARGV' à' {"ls", "-a", "-l"} 'et dans la seconde à' {"ls" , "-l", "-a"} '- le shell n'a aucune connaissance que' ls 'ne se soucie pas de l'ordre des options). – sepp2k

Questions connexes