Alias con variables

He buscado por internet pero no sé cómo hacer que un alias acepte variables. Creo que algo vi de hacer funciones, pero no entiendo.

Mi alias sería para convertir vídeo de lo que sea a MP4. Una captura de lo que intenté en consola (el comando funciona bien, si falla el alias es por meterle $1 y $2):

https://i.imgur.com/QMrMyRT.png
Me suena haber usado variables en alguna ocasión pero no sé si en:

  • Una asignatura de C (unas pocas horas semanales) dentro de un curso de FPGS-II de ASI, hace 20 años con lo que recordar no recuerdo.
  • En MS-DOS con un fichero .BAT hace casi 30 años, con lo que tampoco lo recuerdo.
  • En el BASIC de un Spectrum +2A hace casi 40 años, tampoco lo recuerdo.

A lo mejor estoy enfocando mal la cosa y tendría que buscar información de cómo hacer un script en Bash (uso Fish en Konsole de forma preestablecida).

No sé, lo recuerdo más fácil lo de pedir argumentos (aunque no sé en que año sería eso y con qué).

Saludos

Hola


-b\:a

Tienes que escapar del colon.

No es eso. Este comando, que tengo en el historial todavía, funciona desde Konsole con fish ya tengo el nombre del archivo \ o no (he espaciado que copiar desde Konsole lo junta todo):

ffmpeg -i Parking.wmv -b:a 128k -c:aaac -c:v libx264 -framerate29 -threads2 Park
ing.mp4

Saludos

Hola
Sí, desde el shell funcionará, pero no como un alias.
De todos modos, debe escapar de $ 1 y $ 2 pero aún obtiene un error;


alias mp42='ffmpeg -i \"$1\" -b:a 128k -c:a aac -c:v libx264 -framerate 29 -threads 2 \"$2\"'

"": No such file or directory

Crear una función;


alias mp42='_ffmpeg() { ffmpeg -i "$1" -b:a 128k -c:a aac -c:v libx264 -framerate 29 -threads 2 "$2" ;}; _ffmpeg'

El alias no acepta parámetros, porque no te creas una función que si lo acepta y lo metes en tu .bashrc de tu home. Otra opción es crearte un script que acepta parámetros y debe estar tu ruta de PATH

Mas información: https://linuxhint.com/create-bash-alias-with-arguments-and-parameters/

Lo que dice @malcolmlewis no me va o no sé usarlo:

https://i.imgur.com/G7cHdzx.png
Respecto a lo que dices @DiabloRojo, al final no me he aclarado con la web que me pasastes (y parecía fácil):

https://i.imgur.com/nJOA1Dl.pngEn mi directorio bin de $HOME tengo un archivo (un script) que se creó en 2010 (hace 12 años) que al final tendré que copiar y adaptar el comando:

https://i.imgur.com/mZBone0.png

Pensaba que sería fácil añadir un par de líneas al .bashrc (que es donde tengo 3 alias solamente) pero es que me es imposible hacer algo que funcione (a los pantallazos me remito).

Saludos

Hola meu!!

Ni pretendo saber qué es lo que quieres hacer. Yo estas cosas siempre las resuelvo con scripts, son muy fáciles de manejar. Te pongo un ejemplo muy básico para que lo veas.

Primero creamos el fichero. Le doy el nombre sorprendentemente original de “comando.sh”:

#!/bin/bash

echo "Ahí va un ejemplo de comando"
echo "El nombre del comando es " $0
echo "el primer argumento es " $1
echo "el segundo argumento es " $2
~                                     

Lo primero es poner el código para que se sepa que es un script de bash (yo uso bash), luego una línea y luego 4 comandos.

El primer comando del script simplemente ayuda al darnos el encabezado de lo que va a suceder.
El segundo comando muestra el primer argumento del comando ejecutado, que es el propio nombre del comando. Como (casi) siempre, empezamos en 0.
El tercero muestra el segundo argumento del comando ejecutado (que es su primer argumento xD)
El cuarto muestra el tercer argumento (que es su segundo argumento)

No he puesto opciones de control de errores ni nada. Lo probamos sin argumentos:

tux@maquina:~/Documentos/temporal/bash> sh comando.sh  
Ahí va un ejemplo de comando 
El nombre del comando es  comando.sh 
el primer argumento es  
el segundo argumento es 

Lo probamos con argumentos:

tux@maquina[FONT=monospace]:~/Documentos/temporal/bash>  sh comando.sh "un argumento" "otro argumento" 
Ahí va un ejemplo de comando 
El nombre del comando es  comando.sh 
el primer argumento es  un argumento 
el segundo argumento es  otro argumento
[/FONT]

sh es un metacomando (en mi caso un link a bash) que lo que hace es leer el fichero y ejecutarlo. Igual que si haces p.ej. python mipython.py. Opcionalmente puedes convertirlo en ejecutable (+x) e incluso llevarlo a alguna carpeta bin para que esté en el path de ejecutables.

Uso el comando echo por simplicidad para mostrar como funciona. Puedes usar los comando que quieras, con los argumentos que quieras, etc. Ten atención a cosas que puedan malinterpretarse.

Por ejemplo, creamos renombrar.sh:

#!/bin/bash

echo "vamos a cambiar el nombre del fichero " $1 " a " $2
mv $1 $2


Y lo probamos con un fichero que creamos al efecto

tux@maquina[FONT=monospace]:~/Documentos/temporal/bash> [/FONT]touch fichero_a_cambiar.txt
tux@maquina[FONT=monospace]:~/Documentos/temporal/bash> [/FONT][FONT=monospace]sh renombrar.sh fichero_a_cambiar.txt fichero_cambiado.txt
[/FONT]

Puedes, por supuesto, poner tus comandos: comando -montones de argumentos $1 -otros montones de argumentos.

[Añadido]
Para testear un comando conversor que recibe un nombre de un fichero de entrada y produce uno nuevo de salida, yo empezaría con algo como:

ffmpeg -i $1 -f avi -vcodec mpeg4 -acodec libmp3lame -ar 22050 $2

Suponiendo que -i va seguido por el nombre del fichero a procesar y al final se añade el nombre del fichero de salida ya procesado. Esto se ejecutaría con algo como:

 miconversor.sh mi_primer_video.avi mi_video_procesado.mp4

Aunque es posible que esté interpretando mal qué hace cada cosa, cada vez que necesito usar ffmpeg siempre tengo que andar mirando cómo hace las cosas xD. Para no necesitar sh o indicar toda la ruta, lo pongo en ~/bin y lo hago ejecutable con chmod u+x miconversor.sh
Y me aseguro de que ~/bin está en el path ejecutable: echo $PATH
Si no lo estuviera, lo añado creo que en .bashrc

Salud!!

Gracias por la respuesta Karl.

He creado un fichero MP4.sh con este contenido:

#!/bin/bash
echo "Conversor de archivos de vídeo a MP4"
sleep 1
ffmpeg -i $1 -b:a 128k -c:a aac -c:v libx264 -framerate 29 -threads 2 $2

Lo he hecho ejecutable para ahorrarme el sh delante. Funciona:

**~**/**Descargas**/home/krovikan/bin/mp4.sh KK.mp4 LL.mp4
Conversor de archivos de vídeo a MP4 
ffmpeg version 3.4.9 Copyright (c) 2000-2021 the FFmpeg developers 
  built with gcc 7 (SUSE Linux) 
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --incdir=/usr/include/ffm
peg --extra-cflags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack
-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' --optf
lags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-str
ong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g' --disable-htmlpages 
--enable-pic --disable-stripping --enable-shared --disable-static --enable-gpl --disable-openssl -
-enable-avresample --enable-libcdio --enable-gnutls --enable-ladspa --enable-libass --enable-libbl
uray --enable-libcelt --enable-libcdio --enable-libdc1394 --enable-libfreetype --enable-libgsm --e
nable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libspeex --enabl
e-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-li
bwebp --enable-libzimg --enable-libzvbi --enable-vaapi --enable-vdpau --enable-libopencore-amrnb -
-enable-libopencore-amrwb --enable-version3 --enable-libx264 --enable-libx265 --enable-libxvid 
  libavutil      55. 78.100 / 55. 78.100 
  libavcodec     57.107.100 / 57.107.100 
  libavformat    57. 83.100 / 57. 83.100 
  libavdevice    57. 10.100 / 57. 10.100 
  libavfilter     6.107.100 /  6.107.100 
  libavresample   3.  7.  0 /  3.  7.  0 
  libswscale      4.  8.100 /  4.  8.100 
  libswresample   2.  9.100 /  2.  9.100 
  libpostproc    54.  7.100 / 54.  7.100 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'KK.mp4': 
  Metadata: 
    major_brand     : isom 
    minor_version   : 512 
    compatible_brands: isomiso2avc1mp41 
    title           : So I Tried Elden Ring 
    artist          : CarbotAnimations 
    date            : 2022 
    encoder         : Lavf58.76.100 
    comment         : https://www.youtube.com/watch?v=LSyRf8rAjTs 
  Duration: 00:01:27.77, start: 0.000000, bitrate: 873 kb/s 
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1
:1 DAR 16:9], 740 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default) 
    Metadata: 
      handler_name    : ISO Media file produced by Google Inc. 
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (defau
lt) 
    Metadata: 
      handler_name    : ISO Media file produced by Google Inc. 
Stream mapping: 
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264)) 
  Stream #0:1 -> #0:1 (aac (native) -> aac (native)) 
Press [q] to stop, ?] for help 
[libx264 @ 0x5617ac1b27a0] using SAR=1/1 
[libx264 @ 0x5617ac1b27a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 
[libx264 @ 0x5617ac1b27a0] profile High, level 4.0, 4:2:0, 8-bit 
[libx264 @ 0x5617ac1b27a0] 264 - core 161 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://w
ww.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 
psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11
 fast_pskip=1 chroma_qp_offset=-2 threads=2 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 
weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc_lookahead=4
0 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 
Output #0, mp4, to 'LL.mp4': 
  Metadata: 
    major_brand     : isom 
    minor_version   : 512 
    compatible_brands: isomiso2avc1mp41 
    title           : So I Tried Elden Ring 
    artist          : CarbotAnimations 
    date            : 2022 
    comment         : https://www.youtube.com/watch?v=LSyRf8rAjTs 
    encoder         : Lavf57.83.100 
    Stream #0:0(und): Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 1
6:9], q=-1--1, 24 fps, 12288 tbn, 24 tbc (default) 
    Metadata: 
      handler_name    : ISO Media file produced by Google Inc. 
      encoder         : Lavc57.107.100 libx264 
    Side data: 
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1 
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (defau
lt) 
    Metadata: 
      handler_name    : ISO Media file produced by Google Inc. 
      encoder         : Lavc57.107.100 aac 
frame= 2105 fps= 67 q=-1.0 Lsize=   10918kB time=00:01:27.77 bitrate=1019.1kbits/s speed= 2.8x     
video:9477kB audio:1376kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.601
306% 
[libx264 @ 0x5617ac1b27a0] frame I:45    Avg QP:14.32  size: 39456 
[libx264 @ 0x5617ac1b27a0] frame P:883   Avg QP:21.42  size:  6710 
[libx264 @ 0x5617ac1b27a0] frame B:1177  Avg QP:20.00  size:  1702 
[libx264 @ 0x5617ac1b27a0] consecutive B-frames: 18.2% 18.1% 10.8% 52.8% 
[libx264 @ 0x5617ac1b27a0] mb I  I16..4: 26.9% 58.4% 14.8% 
[libx264 @ 0x5617ac1b27a0] mb P  I16..4:  1.3%  4.8%  1.4%  P16..4:  6.8%  1.5%  0.7%  0.0%  0.0% 
   skip:83.6% 
[libx264 @ 0x5617ac1b27a0] mb B  I16..4:  0.1%  0.2%  0.1%  B16..8:  6.5%  0.7%  0.1%  direct: 0.3
%  skip:91.9%  L0:48.4% L1:50.2% BI: 1.4% 
[libx264 @ 0x5617ac1b27a0] 8x8 transform intra:60.7% inter:48.2% 
[libx264 @ 0x5617ac1b27a0] coded y,uvDC,uvAC intra: 14.4% 22.9% 13.9% inter: 0.8% 1.5% 0.3% 
[libx264 @ 0x5617ac1b27a0] i16 v,h,dc,p: 51% 34%  6% 10% 
[libx264 @ 0x5617ac1b27a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 42% 17% 35%  1%  1%  1%  1%  1%  1% 
[libx264 @ 0x5617ac1b27a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 27% 19%  5%  3%  3%  4%  3%  5% 
[libx264 @ 0x5617ac1b27a0] i8c dc,h,v,p: 71% 16% 10%  4% 
[libx264 @ 0x5617ac1b27a0] Weighted P-Frames: Y:1.1% UV:1.1% 
[libx264 @ 0x5617ac1b27a0] ref P L0: 63.3%  5.9% 19.7% 11.0%  0.0% 
[libx264 @ 0x5617ac1b27a0] ref B L0: 79.1% 17.8%  3.0% 
[libx264 @ 0x5617ac1b27a0] ref B L1: 96.6%  3.4% 
[libx264 @ 0x5617ac1b27a0] kb/s:885.11 
[aac @ 0x5617ac1f3400] Qavg: 2280.786 

**~**/**Descargas** ✔  32s  14:12:24 

Ahora me falta añadir /home/krovikan/bin al PATH para no tener que teclear la ruta entera. He probado esto pero parece que lo añade y no lo encuentra (he tenido que pasar a bash un momento porque en fish no funciona ese comando):

**~**/**Descargas**bash ✔  14:26:31 
krovikan@Linux:~/Descargas> echo $PATH 
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin 
krovikan@Linux:~/Descargas> export PATH=$PATH:/home/krovikan/bin 
krovikan@Linux:~/Descargas> echo $PATH 
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/krovikan/bin 
krovikan@Linux:~/Descargas> mp4 KK.mp4 LL.mp4 
Si 'mp4' no es un error tipográfico, puede usar la búsqueda de orden no encontrada, para saber a q
ué paquete pertenece, así: 
    cnf mp4

He añadido al final del .profile el export pero aún no he reiniciado la sesión para probarlo (aunque no tengo ningua esperanza).

Probé también en copiar el script a /usr/local/bin (que sale en el path) pero además de obligarme a usar sudo tampoco va.

Saludos

Hola @krovikan

Veamos.

En el primer código, ejecutas “mp4.sh”. En el último código, ejecutas “mp4”. Ambos nombres no son los mismos, por lo que lo primero es cerciorarse si es un error al copiar/pegar o si es efectivamente lo que has probado. En este caso, prueba con mp4.sh; si funciona, pues ya vemos lo del profile, si no funciona, pues seguimos.

Salud!

Buen ojo.

Fallo garrafal por mi parte. Funciona perfectamente sin especificar ruta alguna (al estar en /usr/local/bin) con:

mp4.sh KK.mp4 LL.mp4

Me he permitido hasta el lujo de renombrarlo a mp4 y todo bien:

mp4 KK.mp4 LL.mp4

Ahora lo que me trae mosca es que en .bashrc tengo desde hace unos meses un par de alias que funcionan bien. Pero le he metido un 3º que no funciona:

alias ls1='exa -labh --long'
alias hoy="date +\"Hoy es %A, %d de %B de %Y %nEsta es la semana %V y han pasado %j días de este año %nSon las %R %:z %Z\""
alias cls='clear'

El alias es el 3º, el alias cls=‘clear’. Si lo defino en una consola funciona bien con alias cls=‘clear’ mientras no cierre la consola.

Saludos

mi apuesta es también por usar un script y ponerlo en /usr/bin por ejemplo…

Hola!

Garrafal no, un despiste, a veces pasa. Yo suelo usar .sh como extensión de los scripts precisamente para saber que son eso, scripts. Pero cada uno con su librillo :slight_smile:

Ahora lo que me trae mosca es que en .bashrc tengo desde hace unos meses un par de alias que funcionan bien. Pero le he metido un 3º que no funciona:

alias ls1='exa -labh --long'
alias hoy="date +\"Hoy es %A, %d de %B de %Y %nEsta es la semana %V y han pasado %j días de este año %nSon las %R %:z %Z\""
alias cls='clear'

El alias es el 3º, el alias cls=‘clear’. Si lo defino en una consola funciona bien con alias cls=‘clear’ mientras no cierre la consola.

Saludos

Ok, yo no uso fish. Entiendo que no usa .bashrc aunque es posible que al instalarlo tome su configuración. Según Introduction — fish-shell 3.7.0 documentation la configuración respectiva está en .config/fish/config.fish pero, como he dicho, no tengo la menor idea de cómo va lol! Voy mayor para cambiar de shell.

No sé si usas fish, pero ¿dónde configurarías los alias?

Salud!!

Uso fish (con el mod tide, gracias Víctor). Los alias los tengo en .bashrc.

Los alias ls1 y hoy funcionan bien. Lo que no sé es si ya estaban cuando instalé tide fish o no. De todas formas…

estoy viendo el archivo de configuración que me indicas (.config/fish/config.fish) y veo que sólo contiene esto:

if status is-interactive
    # Commands to run in interactive sessions can go here
    alias ls1='exa -labh --long'
    alias hoy="date +\"Hoy es %A, %d de %B de %Y %nEsta es la semana %V y han pasado %j días de este año %nSon las %R %:z %Z\""
end

Son los alias 1 y 2 del .bashrc. He añadido el 3er alias (el que copié ayer):

alias cls='clear'

He cerrado y reabierto sesión, y ya está funcionando.

Muchísimas gracias Karl, no sabía que era tan fácil como eso.

Saludos

Primero: saber que en el PATH se incluye la carpeta bin del home de usuario donde se pone los scripts del usuario, podéis comprobarlo con
echo $PATH
cd ~/bin
No creo que en el ordenador haya mas usuarios que vosotros, ¿o no?. Así no ponerlos en /usr/local/bin o /usr/bin como sugiereis.

Soy el único usuario (aparte de root).

De todas formas, aunque a mi me dicta el cerebro que sería mejor que tuviera el script en ~/bin, en este comentario se ve como pruebo por activa y por pasiva añadir el /home/krovikan/bin con export y el resultado del echo.

Lo que probé en ese comentario del .profile al final lo borré. Parece que no vaya nada.

Saludos

Hola.

Ya que tenéis curiosidad lol!, veamos.

Si tú tienes dos particiones, para / y /home respectivamente, si pones tus scripts en / y reinstalas, perderás los scripts salvo que hagas una copia de seguridad explícita.

Por otra parte, de acuerdo con la FHS, lo suyo sería /usr/local. Ahora bien, como eso normalmente lo tenemos en /, otra vez si reinstalamos nos quedaremos sin scripts. Naturalmente puedes montar /usr/local en una partición propia…

Y también puede ser que tengas / y /home en la misma partición. En este caso no habría diferencia en cuanto a reinstalar.

Salud!!

Karl, que me montastes el ordenador hace casi 6 años y sigo sin cambiar su estructura. :wink:

Recordarás el SSD M.2 de WD Blue de 500Gb montado sobre la placa Asus. Eso es / y una partición extra XFS para cuando quiero acelerar alguna cosa (algún juego normalmente que es con lo que me distraigo).

Copias tengo, pero sería mucho más cómodo no redundar datos en una / voluble y tenerlo en el ~/bin. Ahí tengo algún script de 2010 y 2012 y una aplicación python que bajé en 2010 para calcular sumas de verificación MD5 y SHA (no sé si alguna cosa más). A día de hoy creo que podría borrar todo eso antiguo que he citado.

Saludos

Ah, sólo eran las ideas generales tras la decisión de instalar en un lugar u otro. Por ejemplo, tengo algún servidor CentOS para Odoo y los ficheros para convertir HTML a PDF (wkhtml2pdf) los copio directamente en /usr/bin por simplicidad lol!.

En este equipo de escritorio, en cambio, tengo una carpeta para aplicaciones locales (~/Aplicacións) y en el portátil tengo algún script en ~/bin.

Aunque no se puede decir que una fórmula sea más válida que otra, lo cierto es que los principios generales son válidos: los VPS con Odoo tienen una sola partición, este equipo tiene un montón de ellas, y el portátil dos en discos diferentes.

Salud!!

Esta mañana he seguido las instrucciones del enlace que te reporte sobre como hacer una función en .bashrc de mi home de usuario. Parecía que no funcionaba y no lo comente en el foro.
Ahora, a encender el ordenador veo que la función de esta mañana me funciona perfectamente. Parece que había que reinicializar para que cogiera la función creada.
Aquí te dejo un ejemplo:
https://i.ibb.co/HBQMBWj/Screenshot-20220619-162013.png](Screenshot-20220619-162013 hosted at ImgBB — ImgBB)

Interesante si me hace falta en el futuro (en mi caso sería aplicarlo a ~/.config/fish/config.fish). :good:

Ahora me gustaría arreglar ese $PATH que me trae de cabeza.

Saludos