2016-08-09 1 views
0

J'ai un exécutable qui est placé sur ma machine Linux de sorte que la longueur du chemin vers l'exécutable est de 107 caractères. J'ai trouvé le nombre de caractères en utilisant la commande echo -n "/path/to/the/executable" | wc -c -m. Lorsque je tente d'exécuter le fichier exécutable avec son chemin complet, je reçois l'erreur suivante:Dash, y at-il une limitation sur le chemin de fichier

sh: 1: /subpath/to/the/executable: not found

J'ai vérifié la longueur /subpath/to/the/executable et il est de 81 caractères. Et si je place mon exécutable de sorte que sa longueur de chemin est inférieure à 81 caractères, je ne reçois pas le sh error ci-dessus.

J'ai fait quelques recherches et j'ai trouvé que la limite du chemin du fichier sur Linux env est de 255 caractères. Je n'ai pas pu trouver si le tableau de bord ou le shell avait des limitations sur le chemin du fichier. Sur ma machine/bin/sh est un lien symbolique vers/bin/dash. Est-ce que quelqu'un peut expliquer cette limite de 81 caractères sur le chemin de fichier imposé par tiret?

Y a-t-il un moyen d'augmenter la limite?

+0

est-ce que '/ subpath /' existe et corrige? qu'est-ce que c'est, dossier dans/(racine) ou sous-dossier? (pourquoi vous vous référez alors à un chemin complet?) –

+1

Je soupçonne que les chemins réels impliqués sont plus pertinents que leurs longueurs. – chepner

+0

@OleksandrKravchuk, '/ subpath /' n'existe pas. Il s'agit des 81 premiers caractères de '/ chemin/vers/le/exécutable'. L'exécutable est placé dans divers répertoires et je peux changer mon répertoire courant et exécuter le fichier en tant que './File' mais je l'exécute à partir du code java et je dois donc fournir le chemin complet. – user2888308

Répondre

1

Oui, dash (en raison de Linux) a des limites sur les longueurs de: chemins de fichiers

  • Aucune entrée dans le chemin d'accès peut être plus de 255 caractères.
  • Aucun chemin total ne peut dépasser 4095 caractères.

Voici des exemples démontrant ceci:

$ "$(head -c 255 /dev/zero | tr '\0' 'x')" 
dash: 2: xxxxxx[...]xxxxxxx: not found 

$ "$(head -c 256 /dev/zero | tr '\0' 'x')" 
dash: 3: xxxxxx[...]xxxxxxxx: File name too long 

$ "$(while true; do printf "/x"; done | head -c 4095)" 
dash: 4: /x/x/[...]/x/x/x/: not found 

$ "$(while true; do printf "/x"; done | head -c 4096)" 
dash: 5: /x/x/[...]/x/x/x/x: File name too long 

Aucune limite affecte 81 caractères ou 107 noms de caractères. Voici un exemple montrant que 200 caractères fonctionnent très bien dans dash:

$ name="./$(head -c 200 /dev/zero | tr '\0' x)" 
$ printf '%s\n' '#!/bin/sh' 'echo "hello world"' > "$name" 
$ chmod +x "$name" 
$ "$name" 
hello world 

Si vous avez des questions au sujet de pourquoi un programme Java peut échouer pour exécuter une commande correctement, s'il vous plaît les poster séparément sous l'étiquette java. Assurez-vous de ne pas abréger ou masquer les noms de fichiers, car les valeurs exactes sont très importantes.