En supposant que je suis dans le même dossier qu'un fichier exécutable, je devrais taper ceci pour l'exécuter:
./file
Je préfère ne pas avoir à taper /, car il /m'est difficile de taper.
Existe-t-il un moyen plus simple d'exécuter un fichier? Idéalement, juste une syntaxe simple comme:
.file
ou autre chose mais plus facile que d'y insérer le /caractère.
Il y a peut-être un moyen de mettre quelque chose dans le /bin
répertoire, ou de créer un alias pour l'interpréteur, afin que je puisse utiliser:
p file
filenames
executable
IMSoP
la source
la source
/
est largement utilisé sous Unix, principalement comme séparateur de répertoires. Vous feriez probablement mieux de trouver un moyen plus simple de le taper./
n'est pas difficile à taper pour la grande majorité des gens, et si OP a une blessure qui l'empêche, ils devraient envisager d'autres dispositions de clavier, car il n'y a aucun moyen qu'ils puissent éviter/
complètement lorsqu'ils sont dans le terminal./
le shift-7 qui est relativement difficile à taper, même sans blessure.Réponses:
Cela peut être "risqué", mais vous pourriez en avoir. dans votre CHEMIN.
Comme cela a été dit dans d'autres, cela peut être dangereux, alors assurez-vous toujours. est à la fin du CHEMIN plutôt qu'au début.
la source
cd
à un répertoire accessible en écriture et essayez d'utiliser une commande qui n'est pas sur votre chemin, vous pouvez exécuter un exécutable (éventuellement malveillant) du même nom que quelqu'un a écrit sur ce chemin. C'est bien pire si vous mettez.
au début de votre chemin. Dans ce cas, un exécutable malveillant appeléls
serait exécuté si vous essayez d'appelerls
dans ce répertoire.p
commande serait meilleure..
début dePATH
, tout ce qu'un utilisateur malveillant doit faire est de déposer une faussels
commande dans son répertoire et de persuader l'administrateur de "regarder quelque chose de bizarre" et il a un accès root.test
, comme dans le titre de la question (car iltest
s'agit d'un shell intégré, et existe probablement aussi quelque part dans votre$PATH
déjà)..
se complétera automatiquement pour./
(taper.
et appuyer Tab) au moins dans les shells Bash modernes, donc vous ne devriez pas avoir à utiliser unePATH
solution complexe ou non sécurisée (comme une modification).S'il ne se complète pas automatiquement, vous devrez peut-être installer le package "bash-complètement".
la source
.
a plusieurs candidats à l'achèvement:.
( répertoire actuel), (répertoire..
parent), la.
commande (pour laquelle bash fournit un alias non standardsource
) et tout fichier dot présent. Peut-être que lebash-completion
paquet ignore cela; Je le trouve atrocement ennuyeux (par exemple, il est impossible de compléter les noms de répertoires par tabulation dans unemake
ligne de commande et est généralement horrible avec des makefiles remplis de règles implicites), donc je le purge toujours.make
cibles.Il est possible d'écrire une telle fonction:
dans votre
~/.bashrc
. Ensuite, vous pourrez exécuterp app arguments
au lieu de./app arguments
. Cette solution fonctionne pour les exécutables de tout type, y compris les scripts et les binaires."$@"
se développe en une liste d'arguments correctement citée passée à la fonction (en préservant tous les caractères spéciaux de l'expansion glob ou variable) et, comme l'a souligné @Scott,bash
est assez intelligent pour ajouter./
le premier d'entre eux, en préservant le reste.la source
strace -f p app
pour voir les appels système effectués ou$(which time) p app
pour voir combien de temps cela prend.p
comme un script exécutable fonctionnerait mieux dans ces deux exemples spécifiques que j'ai inventés. Aucune des deux solutions ne pourrait fonctionnerldd p app
, même sildd
elle diffère également par la nécessité d'un chemin complet, peut-être pour des raisons comme celle-ci.p app args
par./app args
une manière invisible pour quiconque nécessiterait une entrée de shell de tuyauterie via une sorte de préprocesseur et provoquerait toutes sortes de divertissements lorsque la substitution se produit dans un endroit non$@
? Sinon, il passera juste un gros argument au programme.$@
est un tableau. Une fois développé à l'intérieur"
, chaque paramètre se développe en un mot distinct.$*
se comporte comme vous le pensez.p() { ./"$@"; }
tout ce dont vous avez besoin.Vous pouvez mettre
.
à votre$PATH
en ajoutant par exemplePATH=$PATH:.
à votre/etc/profile
, de cette façon, vous pouvez exécuterfile
simplement en écrivantfile
, sauf s'il se trouve dans un autre dossier de votre chemin (par exemple/usr/bin/
). Notez que ce n'est généralement pas une bonne idée.Pourquoi c'est mauvais: disons que vous êtes dans une situation où vous ne faites pas entièrement confiance au contenu d'un répertoire - vous l'avez téléchargé depuis un endroit louche et vous voulez l'examiner avant de l'exécuter, ou vous êtes un administrateur système aidant certains l'utilisateur en regardant dans son répertoire personnel, etc. Vous voulez lister le répertoire, donc vous essayez de taper ls, mais oups, vous faites une faute de frappe, et vous avez fini par taper sl à la place. L'auteur de ce répertoire malveillant a anticipé cela et y a mis un script shell appelé "sl" qui exécute 'rm -rf --no-preserve-root /' (ou quelque chose de plus malveillant comme l'installation d'un rootkit).
(Merci @Muzer pour l'explication)
la source
Vous pouvez appeler l'interprète, par exemple
Dans ce cas, le script s'exécutera même s'il n'a ni ligne de shebang (par exemple
#!/bin/bash
) ni bit exécutable. Vous devrez également connaître l'interprète approprié pour l'exécuter également. Vous pouvez d'abord lire la ligne shebang du fichier pour vous assurer d'appeler l'interprète correct, par exemple si la ligne shebang indiquetu appellerais
la source
/lib/ld.so
Pour autant que je sache, il n'y a aucun moyen d'y parvenir à moins d'inclure le fichier dans le chemin env, vous pouvez donc l'exécuter en tapant simplement:
file
.file
ne fonctionnera pas car il s'agit d'un nom de fichier différent. C'est un fichier appelé.file
et non./file
.J'ai l'impression que la barre oblique peut être difficile à taper pour vous car la mise en page n'est pas en anglais, peut-être? Dans ce cas, cela m'arrive aussi, donc j'échange fréquemment ma disposition de clavier en anglais en appuyant sur Alt + Maj dans Windows (j'utilise Linux de ssh)
la source
Les gens ont suggéré d'ajouter
.
àPATH
, ce qui est dangereux car cela crée un risque que vous exécutiez accidentellement un programme malveillant planté dans un répertoire accessible en écriture. Mais, si vous avez des programmes exécutables dans quelques répertoires que vous possédez et qui sont inscriptibles que par vous, alors il est sûr (assez sûr?) Pour mettre les directeur (s) dansPATH
, en ajoutant une ligne commeà votre
~/.bashrc
dossier. Bien sûr, cela signifie que vous pouvez exécuter un programme à partir de l'un de ces répertoires depuis n'importe où dans le système de fichiers. Par exemple, vous pourriezcd /etc
et tapezfoo
, et il s'exécuterait~/dev/myprog1/foo
. Cela présente l'inconvénient mineur que vous ne pouvez pas avoir de programmes du même nom dans plus d'un des répertoires. Plus précisément, si vous avez des programmes appelésfoo
dans les deux~/dev/myprog1
et~/dev/myprog2
, vous ne pourrez pas exécuter le second sauf en spécifiant un chemin. De même, si vous avez un~/dev/myprog1/cat
- mais pourquoi voudriez-vous?Une autre approche, si vous n'avez que quelques programmes avec lesquels vous le faites, consiste à leur définir des alias:
Ou vous pouvez appeler les alias
.gizmo
et.gonzo
si vous trouvez cela plus intuitif.En fait, cela a, dans une certaine mesure, le même risque de sécurité que de mettre
.
dans votrePATH
. Si un utilisateur malveillant peut lire votre.bashrc
fichier et voir vos alias, il peut placer des logiciels malveillants appelésgizmo
etgonzo
dans des répertoires aléatoires dans l'espoir que vous les exécuterez. Il vaut mieux utiliser ces noms de chemin absolus:Soit dit en passant, vous devez éviter de nommer un exécutable
test
, car il s'agit d'une commande intégrée au shell, et vous ne pouvez exécuter un programme avec ce nom qu'en spécifiant un chemin ou une autre astuce.la source
make gizmo
oumake gonzo
.Makefile
dans chaque répertoire, de sorte que les actions semake gizmo
terminent par l' exécutiongizmo
? (1) Cela semble être une manière maladroite de faire la même chose que lap
fonction, suggérée dans la question, initialement mise en œuvre par aitap , et affinée par Scott. (2) Pouvez-vous transmettre des arguments de cette façon? ISTMmake gizmo arg1 arg2
équivalent àmake gizmo; make arg1; make arg2
../
dans tous les répertoires . Dans mon esprit, il développe quelque chose et a juste besoin d'exécuter le programme produit./file
souvent. Je ne peux vraiment pas penser à un autre scénario où l'on aurait souvent besoin d'exécuter un fichier local et s'il ne l'exécute pas fréquemment, il ne prendrait pas la peine de poser la question (il a dit difficile pas impossible ) (2) pas vraiment mais vous pouvez passer les arguments dans la recette.Pour développer la réponse de Zanna à propos des interprètes (désolé, pas de représentant pour un commentaire): un "interprète" pour les exécutables natifs (alias fichiers ELF binaires) est le chargeur dynamique (
ld.so
), mais il ne comprend généralement pas la syntaxe que vous souhaitez:(également, sauf si vous créez un lien symbolique
ld.so
vers votre chemin, vous devez toujours écrire/
s)la source
binfmt_misc
./libexec/ld-elf.so.1
. Sous Linux, ce n'est pas aussi simple que de "décider comment exécuter un binaire":binfmt_misc
détecte le format du fichier par des nombres magiques (ELF, script shebang, CIL). Après cela, lebinfmt_elf
gestionnaire est appelé. Il analyse les en-têtes et sections ELF;.interp
la section contient le chemin du chargeur dynamique; ce chargeur est démarré par le noyau, effectue des délocalisations et passe à_start
. Sur FreeBSD (pas sûr des autres), il n'y a pas de binfmt, mais le principe est +/- similaire.ld.so
n'a pas.interp
et est lié statiquement, ce qui signifie qu'il n'a pas besoin d'un autre éditeur de liens / chargeur dynamique pour résoudre ses symboles externes et effectuer des calculs de relocalisation.Si nous sommes autorisés à commencer à configurer les choses
La plupart des distributions modernes incluent déjà ~ / .local / bin dans $ PATH (ajoutez-
export PATH="$HOME/.local/bin:$PATH"
les~/.profile
si les vôtres ne le font pas). Ensuite, vous pouvez utiliserx file
pour exécuter./file
.N'essayez pas de définir une
.
commande. La commande. script
s'exécute déjàscript
dans le shell actuel. Cela permetscript
de définir des variables d'environnement pour le shell courant.la source
exec "$@"
.$ (ln -s /bin/ls my-ls && exec my-ls) # bash: exec: my-ls: not found
shift $1
; justeexec ./"$@"
. (2) Puisque vous parlez d'un script shell, il est un peu inutile / trompeur de conseiller aux gens de ne pas définir de.
commande, car il est impossible de créer un fichier appelé.
. (Il est possible, et très déconseillé, de définir un alias ou une fonction shell appelée.
.)Si nous sommes autorisés à créer des scripts d'aide, vous pouvez créer un assistant qui ajoute le pwd au PATH, puis exécuter
Cela évite d'ajouter "." vers le chemin et polluer votre .profile avec chaque chemin dans lequel vous pourriez à un moment donné vouloir exécuter quelque chose.
Nous pouvons pousser cette approche un peu plus loin en créant un assistant qui lance un nouveau shell avec un PATH modifié. S'il prend un répertoire comme paramètre (en utilisant le pwd par défaut), il fonctionnerait comme un
pushd
qui modifie le chemin. Vous devrez peut-être garder à l'esprit que toute modification des autres variables d'environnement serait perdue lors de la fermeture du sous-shell, mais dans un shell de longue durée, votre variable PATH ne sera pas encombrée. Selon vos workflows, cela peut être avantageux.Mais je suppose que si vous vouliez l'exécuter, vous pourriez pirater
pushd
etpopd
ainsi ils pourraient apporter les mêmes modifications au chemin sans faire un sous-shell qui perdrait d'autres changements.(Vous ne pouvez pas faire de même avec
cd
car il n'a pas d'analoguepopd
.)Vous pouvez également créer une paire dédiée d'aides pour simplement pousser et faire apparaître les entrées PATH. Ce qui fonctionne le mieux dépend vraiment de vos habitudes d'utilisation.
la source
cd
, mais c'est plus loin: créer un fichier comme.dircmds
, et piratercd
pour rendre les commandes définies./.dircmds
indisponibles juste avant le changement et disponibles juste après le changement.Vous pouvez utiliser
. script.sh
syntaxe tant que le script que vous souhaitez exécuter se trouve dans le répertoire courant.Vous pouvez également préfixer l'interpréteur, comme sh ou bash. Exemple:
bash script.sh
la source
. script.sh
se cassera si le script contientexit
, a des effets inattendus, par exemple s'il a redéfini PATH "temporairement"; cela ne fonctionne également que pour les scripts de votre shell actuelexit
vous pourriez le mettre entre parenthèses, c'est-à-dire un sous-shell, mais c'est vrai, ce ne serait toujours que pour les scripts dans le même shell.