Suponiendo que estoy en la misma carpeta que un archivo ejecutable, necesitaría escribir esto para ejecutarlo:
./file
Preferiría no tener que escribir /, porque /es difícil para mí escribir.
¿Hay una manera más fácil de ejecutar un archivo? Idealmente, solo una sintaxis simple como:
.file
o algo más pero más fácil que tener que insertar el /personaje allí.
Quizás haya alguna forma de poner algo en el /bin
directorio, o crear un alias para el intérprete, de modo que pueda usar:
p file
filenames
executable
IMSoP
fuente
fuente
/
se usa ampliamente en Unix, en gran medida como un separador de directorio. Probablemente sea mejor encontrar una forma más fácil de escribirlo./
no es difícil de escribir para la gran mayoría de las personas, y si OP tiene una lesión que lo impide, deberían considerar diseños de teclado alternativos, ya que no hay forma de evitarlos/
completamente mientras están en el terminal./
shift-7, que es relativamente difícil de escribir, incluso sin lesiones.Respuestas:
Puede ser "arriesgado", pero podría haberlo hecho. en tu camino.
Como se ha dicho en otros, esto puede ser peligroso, así que asegúrese siempre. está al final de la RUTA y no al principio.
fuente
cd
a un directorio que se puede escribir en todo el mundo e intenta utilizar un comando que no está en su ruta, podría ejecutar un ejecutable (posiblemente malicioso) con el mismo nombre que alguien escribió en esa ruta. Esto es mucho peor si lo pones.
al comienzo de tu camino. En ese caso,ls
se ejecutará un ejecutable malicioso llamado si intenta llamarls
a ese directorio.p
comando sería mejor..
principioPATH
, todo lo que un usuario malintencionado debe hacer es soltar unls
comando falso en su directorio y persuadir al administrador para que "mire algo extraño" y tenga acceso a la raíz.test
, como en el título de la pregunta (ya quetest
es un shell incorporado, y probablemente también exista en algún lugar de su archivo$PATH
)..
se completará automáticamente para./
(escribir.
y presionar Tab) al menos en los shells Bash modernos, por lo que no debería tener que usar unaPATH
solución compleja o insegura (como la modificación).Si no se completa automáticamente, es posible que deba instalar el paquete "bash-complete".
fuente
.
tiene múltiples candidatos de finalización:.
(directorio actual),..
(directorio principal), el.
comando (que bash proporciona un alias no estándarsource
para) y cualquier archivo de puntos presente. Tal vez elbash-completion
paquete ignora esto; Lo encuentro atrozmente molesto (por ejemplo, hace que sea imposible completar con tabulación los nombres de directorios en unamake
línea de comando y, en general, es horrible con archivos Makefiles llenos de reglas implícitas), por lo que siempre lo purgo.make
objetivos.Es posible escribir tal función:
en su
~/.bashrc
. Entonces podrás correr enp app arguments
lugar de./app arguments
. Esta solución funciona para ejecutables de cualquier tipo, incluidos scripts y binarios."$@"
se expande a la lista de argumentos entregados apropiadamente a la función (preservando todos los caracteres especiales de la expansión global o variable) y, como señaló @Scott,bash
es lo suficientemente inteligente como para anteponer./
al primero de ellos, preservando el resto.fuente
strace -f p app
ver las llamadas realizadas al sistema o$(which time) p app
ver cuánto tiempo lleva.p
como script ejecutable funcionaría mejor en estos dos ejemplos específicos que inventé. Ninguna de las soluciones podría funcionarldd p app
, aunqueldd
también difiere en requerir un camino completo, tal vez por razones como esta.p app args
de./app args
una manera que es invisible a cualquier persona requeriría tubería de entrada de la cáscara a través de algún tipo de preprocesador y causaría todo tipo de diversión cuando se produce la sustitución en un lugar no deseado :)$@
? De lo contrario, solo pasará un gran argumento al programa.$@
es una matriz. Cuando se expande dentro"
, cada parámetro se expande a una palabra separada.$*
se comporta como estás pensando.p() { ./"$@"; }
es todo lo que necesitas.Podrías ponerlo
.
en tu$PATH
agregando, por ejemplo,PATH=$PATH:.
a tu/etc/profile
, de esta manera puedes ejecutarlofile
simplemente escribiendofile
, a menos que esté en alguna otra carpeta en tu ruta (por ejemplo/usr/bin/
). Tenga en cuenta que esto generalmente no es una buena idea.Por qué es malo: supongamos que se encuentra en una situación en la que no confía plenamente en el contenido de un directorio: lo ha descargado de un lugar poco fiable y desea investigarlo antes de ejecutarlo, o es un administrador de sistemas que ayuda usuario buscando en su directorio de inicio, etc. Desea enumerar el directorio, por lo que intenta escribir ls, pero vaya, comete un error tipográfico y terminó escribiendo sl en su lugar. El autor de este directorio malicioso anticipó esto y colocó un script de shell llamado "sl" que ejecuta 'rm -rf --no-preserve-root /' (o algo más malicioso como instalar un rootkit).
(Gracias @ Muzer por la explicación)
fuente
Puedes llamar al intérprete, por ejemplo
En este caso, el script se ejecutará incluso si no tiene una línea shebang (por ejemplo
#!/bin/bash
) ni un bit ejecutable. Deberá conocer el intérprete correcto para ejecutarlo también. Puede leer la línea shebang del archivo primero para asegurarse de llamar al intérprete correcto, por ejemplo, si la línea shebang dicellamarías
fuente
/lib/ld.so
Hasta donde yo sé, no hay forma de lograrlo a menos que incluya el archivo en la ruta env, por lo que podría ejecutarlo simplemente escribiendo:
file
.file
no funcionará ya que ese es un nombre de archivo diferente. Es un archivo llamado.file
y no./file
.Siento que la barra inclinada puede ser difícil de escribir para ti porque ¿quizás no hay un diseño en inglés? En ese caso, también me sucede a mí, por lo que frecuentemente cambio el diseño de mi teclado al inglés presionando Alt + Shift en Windows (uso Linux desde ssh)
fuente
La gente ha sugerido la adición
.
aPATH
, lo cual es peligroso porque crea un riesgo de que accidentalmente ejecutar un programa malicioso plantado en un directorio con permisos de escritura. Pero, si tiene programas ejecutables en algunos directorios de su propiedad y se puede escribir sólo por usted, entonces es seguro (bastante seguro?) Para poner los director (es) enPATH
, al añadir una línea comoa su
~/.bashrc
archivo Por supuesto, esto significa que puede ejecutar un programa desde uno de esos directorios desde cualquier lugar del sistema de archivos. Por ejemplo, podríacd /etc
y escribirfoo
, y se ejecutaría~/dev/myprog1/foo
. Esto tiene el inconveniente menor de que no puede tener programas con el mismo nombre en más de uno de los directorios. Específicamente, si tiene programas llamadosfoo
en ambos~/dev/myprog1
y~/dev/myprog2
, no podrá ejecutar el segundo excepto especificando una ruta. Del mismo modo, si tiene un~/dev/myprog1/cat
...Otro enfoque, si solo tiene unos pocos programas con los que hace esto, es definir alias para ellos:
O puede llamar a los alias
.gizmo
y.gonzo
si lo encuentra más intuitivo.En realidad, esto tiene, hasta cierto punto, el mismo riesgo de seguridad que poner
.
en suPATH
. Si un usuario malintencionado puede leer su.bashrc
y ver sus alias, entonces podría poner malware llamadogizmo
ygonzo
en directorios aleatorios con la esperanza de que lo ejecute. Es mejor hacer que estos usen nombres de ruta absolutos:Por cierto, debe evitar nombrar un ejecutable
test
, ya que es un comando integrado de shell, y puede ejecutar un programa con ese nombre solo especificando una ruta o algún otro truco.fuente
make gizmo
omake gonzo
.Makefile
en cada directorio, de modo que las acciones paramake gizmo
finalizar se ejecutengizmo
? (1) Esa parece una forma incómoda de hacer lo mismo que lap
función, sugerida en la pregunta, implementada inicialmente por aitap y refinada por Scott. (2) ¿Puedes pasar los argumentos de esa manera? ISTM quemake gizmo arg1 arg2
es equivalente amake gizmo; make arg1; make arg2
../
en todos los directorios . En mi opinión, está desarrollando algo y solo necesita ejecutar el programa producido con./file
frecuencia. Realmente no puedo pensar en ningún otro escenario en el que con frecuencia sea necesario ejecutar un archivo local y si no lo está ejecutando con frecuencia no se molestaría en hacer la pregunta (dijo que no es imposible ) (2) en realidad no, pero puedes pasar los argumentos en la receta.Para ampliar la respuesta de Zanna sobre intérpretes (lo siento, no hay representante para un comentario): un "intérprete" para ejecutables nativos (también conocidos como archivos binarios ELF) es el cargador dinámico (
ld.so
), pero generalmente no entiende la sintaxis que desea:(también, a menos que enlace simbólicamente
ld.so
en su ruta, aún necesitaría escribir/
s)fuente
binfmt_misc
está./libexec/ld-elf.so.1
. En Linux, no es tan simple como "decidir cómo ejecutar un binario":binfmt_misc
detecta el formato del archivo por números mágicos (ELF, shebang script, CIL). Después de eso,binfmt_elf
se llama al controlador. Analiza encabezados y secciones ELF;.interp
la sección contiene la ruta del cargador dinámico; el kernel inicia este cargador, realiza reubicaciones y salta a_start
. En FreeBSD (no estoy seguro sobre otros) no hay binfmt, pero el principio es +/- similar.ld.so
no tiene.interp
y está estáticamente vinculado, lo que significa que no necesita otro vinculador / cargador dinámico para resolver sus símbolos externos y hacer cálculos de reubicación.Si se nos permite comenzar a configurar cosas
La mayoría de las distribuciones modernas incluyen ~ / .local / bin en $ PATH ya (agregue
export PATH="$HOME/.local/bin:$PATH"
a su~/.profile
si la suya no lo hace). Entonces puedes usarx file
para correr./file
.No intentes definir un
.
comando. El comando. script
ya se ejecutascript
en el shell actual. Esto permitescript
definir variables de entorno para el shell actual.fuente
exec "$@"
.$ (ln -s /bin/ls my-ls && exec my-ls) # bash: exec: my-ls: not found
shift $1
; acabaexec ./"$@"
. (2) Dado que está hablando de un script de shell, es un poco inútil / engañoso aconsejar a las personas que no definan un.
comando, ya que es imposible crear un archivo llamado.
. (Es posible, y muy desaconsejable, definir un alias o función de shell llamada.
).Si se nos permite hacer scripts de ayuda, puede hacer un ayudante que agregue el pwd a la RUTA, luego ejecute
Esto evita agregar "." a la ruta y contaminar su .profile con cada ruta en la que en algún momento desee ejecutar algo.
Podemos llevar este enfoque un paso más allá al crear un asistente que inicie un nuevo shell con una RUTA modificada. Si toma un directorio como parámetro (usando pwd como predeterminado), funcionaría como un
pushd
que edita la ruta. Es posible que tenga que tener en cuenta que cualquier cambio en otras variables de entorno se perdería al salir de la subshell, pero en un shell de larga ejecución, su variable PATH no se saturará. Dependiendo de sus flujos de trabajo, esto podría ser ventajoso.Pero supongo que si quería correr con ella se podía cortar
pushd
ypopd
para que puedan realizar las mismas modificaciones a la ruta sin sin hacer un subnivel que perderá otros cambios.(No puede hacer lo mismo
cd
porque no tiene un análogopopd
).También puede hacer un par de ayudantes dedicados para simplemente empujar y hacer estallar las entradas de RUTA. Lo que funciona mejor realmente depende de sus patrones de uso.
fuente
cd
, pero está más allá: haga un archivo como.dircmds
y pirateecd
para que los comandos definidos./.dircmds
no estén disponibles justo antes de cambiar y estén disponibles justo después de cambiar.Puede usar la
. script.sh
sintaxis siempre que el script que desee ejecutar esté en el directorio actual.También puede prefijar con el intérprete, como sh o bash. ejemplo:
bash script.sh
fuente
. script.sh
se romperá si el script contieneexit
, tiene efectos inesperados, por ejemplo, si redefinió PATH "temporalmente"; también solo funciona para scripts para su shell actualexit
que podría ponerlo entre paréntesis, es decir, un subshell, pero cierto, todavía sería solo para scripts en el mismo shell.