Angenommen, ich befinde mich im selben Ordner wie eine ausführbare Datei, dann müsste ich Folgendes eingeben, um sie auszuführen:
./file
Ich würde lieber nicht tippen müssen /, weil /es für mich schwierig ist zu tippen.
Gibt es eine einfachere Möglichkeit, eine Datei auszuführen? Idealerweise nur eine einfache Syntax wie:
.file
oder etwas anderes, aber einfacher, als das /Zeichen dort einfügen zu müssen.
Vielleicht gibt es eine Möglichkeit, etwas in das /bin
Verzeichnis einzufügen oder einen Alias für den Interpreter zu erstellen, damit ich Folgendes verwenden kann:
p file
filenames
executable
IMSoP
quelle
quelle
/
wird verwendet , ausführlich in Unix, weitgehend als Verzeichnistrenner. Sie sind wahrscheinlich besser dran, einen einfacheren Weg zu finden, um es zu tippen./
ist für die große Mehrheit der Benutzer nicht schwer zu tippen, und wenn das OP eine Verletzung aufweist, die dies verhindert, sollten sie alternative Tastaturlayouts in Betracht ziehen, da sie es auf keinen Fall vermeiden können, sich/
vollständig im Terminal aufzuhalten./
Shift-7, dessen Eingabe selbst ohne Verletzung vergleichsweise schwierig ist.Antworten:
Es kann "riskant" sein, aber Sie könnten nur haben. in deinem PFAD.
Wie in anderen gesagt wurde, kann dies gefährlich sein, stellen Sie also immer sicher. ist am Ende des PFADS und nicht am Anfang.
quelle
cd
, wenn Sie in ein Verzeichnis wechseln , das von der Welt beschreibbar ist, und versuchen, einen Befehl zu verwenden, der sich nicht in Ihrem Pfad befindet, möglicherweise eine (möglicherweise böswillige) ausführbare Datei mit demselben Namen ausführen, die jemand in diesen Pfad geschrieben hat. Dies ist viel schlimmer, wenn Sie.
am Anfang Ihres Weges setzen. In diesem Fall würde eine aufgerufene böswillige ausführbare Dateils
ausgeführt, wenn Sie versuchen,ls
dieses Verzeichnis aufzurufen .p
Befehl wäre besser..
frühenPATH
Zeitpunkt muss ein böswilliger Benutzer nur noch einen falschenls
Befehl in seinem Verzeichnis ablegen und den Administrator dazu verleiten, "auf etwas Seltsames zu schauen", und er hat Root-Zugriff.test
, wie im Titel der Frage (datest
eine Shell eingebaut ist und wahrscheinlich auch irgendwo in Ihrer$PATH
bereits vorhanden ist)..
wird sich automatisch vervollständigen./
(tippen.
und drücken Tab), zumindest in modernen Bash-Shells, sodass Sie keine komplexe oder unsicherePATH
Lösung (wie das Ändern) verwenden müssen.Wenn es nicht automatisch vervollständigt wird, müssen Sie möglicherweise das Paket "bash-completion" installieren.
quelle
.
Es gibt mehrere Vervollständigungskandidaten:.
(aktuelles Verzeichnis),..
(übergeordnetes Verzeichnis), den.
Befehl (für den Bash ein nicht standardmäßiger Alias angegeben wirdsource
) und alle vorhandenen Punktdateien. Vielleichtbash-completion
ignoriert das Paket dies; Ich finde es furchtbar ärgerlich (z. B. macht es unmöglich, Verzeichnisnamen in einermake
Befehlszeile mit Tabulatoren zu vervollständigen , und es ist im Allgemeinen schrecklich, wenn Makefiles voller impliziter Regeln vorhanden sind), sodass ich sie immer lösche.make
Ziele zu finden.Es ist möglich, eine solche Funktion zu schreiben:
in deinem
~/.bashrc
. Dann können Siep app arguments
stattdessen laufen./app arguments
. Diese Lösung funktioniert für ausführbare Dateien aller Art, einschließlich Skripts und Binärdateien."$@"
dehnt sich in geeigneter Weise zitierte Liste der Argumente an die Funktion übergeben (alle Sonderzeichen aus glob oder variable Expansion zu bewahren), und als @ Scott wies darauf hin,bash
klug genug , um prepend ist./
auf der ersten von ihnen, den Rest zu erhalten.quelle
strace -f p app
Anwendungen unter einem anderen Befehl auszuführen, möchten Sie Systemaufrufe sehen oder$(which time) p app
sehen, wie lange es dauert.p
Da ein ausführbares Skript in diesen beiden Beispielen besser funktionieren würde, habe ich es mir ausgedacht. Weder Lösung konnte mit der Arbeitldd p app
, wenn auchldd
auch unterscheidet einen vollständigen Pfad in erfordern, vielleicht aus Gründen wie diese.p app args
durch./app args
in einer Weise, die für niemanden unsichtbar ist, würde die Eingabe einer Pipeline-Shell durch eine Art Präprozessor erfordern und jede$@
? Andernfalls wird nur ein großes Argument an das Programm übergeben.$@
ist ein Array. Wenn innerhalb von erweitert"
, wird jeder Parameter zu einem separaten Wort erweitert.$*
verhält sich wie du denkst.p() { ./"$@"; }
ist alles, was Sie brauchen.Sie können dies tun
.
,$PATH
indem Sie z. B.PATH=$PATH:.
zu Ihrem hinzufügen/etc/profile
. Auf diese Weise können Sie esfile
nur durch Schreiben ausführenfile
, es sei denn, es befindet sich in einem anderen Ordner in Ihrem Pfad (z/usr/bin/
. B. ). Beachten Sie, dass dies im Allgemeinen keine gute Idee ist.Warum es so schlimm ist: Angenommen, Sie befinden sich in einer Situation, in der Sie dem Inhalt eines Verzeichnisses nicht vollständig vertrauen - Sie haben es von einem zweifelhaften Ort heruntergeladen und möchten es untersuchen, bevor Sie es ausführen, oder Sie sind ein Sysadmin, der einigen hilft Sie möchten das Verzeichnis auflisten, also versuchen Sie, ls einzugeben, aber hoppla, Sie machen einen Tippfehler und geben stattdessen sl ein. Der Autor dieses schädlichen Verzeichnisses hat dies vorausgesehen und ein Shell-Skript namens "sl" eingefügt, in dem "rm -rf --no-preserve-root /" (oder etwas Bösartigeres wie die Installation eines Rootkits) ausgeführt wird.
(Danke @Muzer für die Erklärung)
quelle
Sie können beispielsweise den Dolmetscher anrufen
In diesem Fall wird das Skript auch dann ausgeführt, wenn es weder eine Shebang-Zeile (z. B.
#!/bin/bash
) noch ein ausführbares Bit enthält. Sie müssen den richtigen Interpreter kennen, um es auch ausführen zu können. Sie können die shebang-Zeile der Datei zuerst lesen, um sicherzustellen, dass Sie den richtigen Interpreter aufrufen, zum Beispiel, wenn die shebang-Zeile lautetdu würdest anrufen
quelle
/lib/ld.so
Soweit ich weiß, gibt es keine Möglichkeit, dies zu erreichen, es sei denn, Sie fügen die Datei in den ENV-Pfad ein, und Sie könnten es einfach ausführen, indem Sie Folgendes eingeben:
file
.file
funktioniert nicht, da dies ein anderer Dateiname ist. Es ist eine Datei namens.file
und nicht./file
.Ich habe das Gefühl, dass es schwierig sein kann, Schrägstriche für Sie zu schreiben, weil das Layout nicht englisch ist, vielleicht? In diesem Fall passiert es mir auch, also tausche ich mein Tastaturlayout häufig durch Drücken von Alt + Shift in Windows in Englisch aus (ich verwende Linux von ssh aus).
quelle
Die Leute haben vorgeschlagen , das Hinzufügen
.
zuPATH
, was gefährlich ist , weil es ein Risiko darstellt, dass Sie versehentlich ein bösartiges Programm gepflanzt in einer Welt beschreibbaren Verzeichnis ausgeführt werden. Aber, wenn Sie in ein paar Verzeichnisse ausführbare Programme, die Sie besitzen und beschreibbar sind nur von Ihnen, dann ist es sicher (ziemlich sicher?) Stellen diejenigen Direktor (en) inPATH
, indem Sie eine Zeile wiezu Ihrer
~/.bashrc
Datei. Dies bedeutet natürlich, dass Sie ein Programm von einem dieser Verzeichnisse aus von einer beliebigen Stelle im Dateisystem ausführen können. Zum Beispiel könnten Siecd /etc
und eingebenfoo
, und es würde laufen~/dev/myprog1/foo
. Dies hat den kleinen Nachteil, dass Sie nicht in mehr als einem der Verzeichnisse gleichnamige Programme haben können. Insbesondere wenn Sie Programme haben, diefoo
in beiden~/dev/myprog1
und aufgerufen werden~/dev/myprog2
, können Sie das zweite Programm nur ausführen, indem Sie einen Pfad angeben. Ebenso, wenn Sie eine haben~/dev/myprog1/cat
- aber warum würden Sie wollen?Ein anderer Ansatz, wenn Sie nur wenige Programme haben, mit denen Sie dies tun, besteht darin, Aliase für diese zu definieren:
Oder Sie können die Aliase anrufen
.gizmo
und.gonzo
wenn Sie das intuitiver finden.Dies birgt
.
in gewissem Maße das gleiche Sicherheitsrisiko, das Sie auch in Ihrem Computer habenPATH
. Wenn ein böswilliger Benutzer Ihre lesen kann.bashrc
und Ihre Aliase sieht, dann könnte er Malware genannt gesetztgizmo
undgonzo
in zufälligen Verzeichnissen , in der Hoffnung , dass Sie es laufen werden. Es ist besser, dafür absolute Pfadnamen zu verwenden:Übrigens sollten Sie die Benennung einer ausführbaren Datei vermeiden
test
, da dies ein in die Shell integrierter Befehl ist, und Sie können ein Programm mit diesem Namen nur ausführen, indem Sie einen Pfad oder einen anderen Trick angeben.quelle
make gizmo
odermake gonzo
.Makefile
in jedem Verzeichnis ein erstellt, sodass die Aktionen zummake gizmo
Beenden ausgeführt werdengizmo
? (1) Dies scheint eine umständliche Methode zu sein, um das Gleiche zu tun wie diep
in der Frage vorgeschlagene Funktion, die ursprünglich von aitap implementiert und von Scott verfeinert wurde. (2) Können Sie auf diese Weise Argumente übergeben? ISTM,make gizmo arg1 arg2
das äquivalent zu istmake gizmo; make arg1; make arg2
../
in jedem Verzeichnis etwas zu benutzen . Meiner Meinung nach entwickelt er etwas und muss das produzierte Programm nur./file
oft ausführen . Ich kann wirklich nicht denken Sie an jedem anderen Szenario , in dem man häufig benötigen würde eine lokale Datei ausführen und wenn er es nicht läuft häufig würde er sich nicht die Mühe , die Frage zu stellen (er sagte schwierig nicht unmöglich ) (2) nicht wirklich , aber Sie können die Argumente im Rezept übergeben.Um die Antwort von Zanna zu Interpreten zu erweitern (Entschuldigung, kein Mitarbeiter für einen Kommentar): Ein "Interpreter" für native ausführbare Dateien (auch als binäre ELF-Dateien bezeichnet) ist der dynamische Loader (
ld.so
), versteht jedoch in der Regel nicht die gewünschte Syntax:(Auch wenn Sie nicht
ld.so
auf Ihren Pfad verlinken , müssen Sie noch/
s schreiben. )quelle
binfmt_misc
soll./libexec/ld-elf.so.1
. Unter Linux ist es nicht so einfach wie "Entscheiden, wie eine Binärdatei ausgeführt werden soll":binfmt_misc
Erkennt das Format der Datei anhand von magischen Zahlen (ELF, Shebang-Skript, CIL). Danach wird derbinfmt_elf
Handler aufgerufen. Es analysiert ELF-Header und -Abschnitte..interp
Abschnitt enthält Pfad des dynamischen Laders; Dieser Loader wird vom Kernel gestartet, führt Umzüge durch und springt zu_start
. Unter FreeBSD gibt es keine binfmt, aber das Prinzip ist +/- ähnlich.ld.so
hat keine.interp
statische Verknüpfung und ist statisch verknüpft. Dies bedeutet, dass kein anderer dynamischer Linker / Loader erforderlich ist, um die externen Symbole aufzulösen und die Verschiebung zu berechnen.Wenn wir anfangen dürfen, Dinge zu konfigurieren
In den meisten modernen Distributionen ist ~ / .local / bin bereits in $ PATH enthalten (fügen Sie dies
export PATH="$HOME/.local/bin:$PATH"
zu Ihren hinzu ,~/.profile
wenn dies bei Ihnen nicht der Fall ist). Dann kannst dux file
mit rennen./file
.Versuchen Sie nicht, einen
.
Befehl zu definieren . Der Befehl wird. script
bereitsscript
in der aktuellen Shell ausgeführt. Dadurch könnenscript
Umgebungsvariablen für die aktuelle Shell definiert werden.quelle
exec "$@"
.$ (ln -s /bin/ls my-ls && exec my-ls) # bash: exec: my-ls: not found
shift $1
; einfachexec ./"$@"
. (2) Da es sich um ein Shell-Skript handelt, ist es etwas sinnlos / irreführend, den Leuten zu raten, keinen.
Befehl zu definieren , da es unmöglich ist, eine Datei mit dem Namen zu erstellen.
. (Es ist möglich und sehr ratsam, einen Alias oder eine Shell-Funktion mit dem Namen zu definieren.
.)Wenn wir Hilfsskripte erstellen dürfen, können Sie einen Helfer erstellen, der das pwd zum PATH hinzufügt, und dann ausführen
Dies vermeidet das Hinzufügen von "." auf den Pfad und verschmutzen Sie Ihr .profile mit jedem Pfad, in dem Sie irgendwann etwas ausführen möchten.
Wir können diesen Ansatz noch einen Schritt weiter gehen, indem wir einen Helfer erstellen, der eine neue Shell mit einem modifizierten PATH startet. Wenn ein Verzeichnis als Parameter verwendet wird (standardmäßig wird pwd verwendet), funktioniert es wie ein
pushd
, das den Pfad bearbeitet. Möglicherweise müssen Sie sich bewusst sein, dass Änderungen an anderen Umgebungsvariablen beim Verlassen der Subshell verloren gehen, aber in einer lang laufenden Shell wird Ihre PATH-Variable nicht überfüllt sein. Abhängig von Ihren Arbeitsabläufen kann dies vorteilhaft sein.Aber ich denke, wenn Sie damit laufen wollten, könnten Sie hacken
pushd
undpopd
so können sie die gleichen Änderungen am Pfad vornehmen, ohne eine Subshell zu erstellen, die andere Änderungen verliert.(Mit kann man nicht dasselbe machen,
cd
da es kein Analogon zu hatpopd
.)Sie können auch ein spezielles Hilfspaar erstellen, um PATH-Einträge zu verschieben und zu platzieren. Was am besten funktioniert, hängt wirklich von Ihren Nutzungsmustern ab.
quelle
cd
, aber es ist noch weiter draußen: Erstellen Sie eine Datei wie.dircmds
und hacken Siecd
, um die in./.dircmds
nicht verfügbar definierten Befehle direkt vor dem Umschalten und direkt nach dem Umschalten verfügbar zu machen .Sie können die
. script.sh
Syntax verwenden, solange sich das Skript, das Sie ausführen möchten, im aktuellen Verzeichnis befindet.Sie können dem Interpreter auch ein Präfix voranstellen, z. B. sh oder bash. Beispiel:
bash script.sh
quelle
. script.sh
bricht ab, wenn das Skript enthältexit
, hat unerwartete Auswirkungen, z. B. wenn PATH "vorübergehend" neu definiert wurde; Es funktioniert auch nur für Skripte für Ihre aktuelle Shellexit
Sie betrifft , könnten Sie es in runde Klammern setzen, dh in eine Subshell, aber wahr, es wäre immer noch nur für Skripte in derselben Shell.