PDA

View Full Version : OTHER VERSION Alias con variables



krovikan
17-Jun-2022, 07:11
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

malcolmlewis
17-Jun-2022, 07:33
Hola



-b\:a



Tienes que escapar del colon.

krovikan
17-Jun-2022, 10:06
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

malcolmlewis
17-Jun-2022, 10:35
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'

DiabloRojo
17-Jun-2022, 23:05
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/

krovikan
18-Jun-2022, 02:20
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

karlggest
18-Jun-2022, 04:10
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:~/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

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:~/Documentos/temporal/bash> touch fichero_a_cambiar.txt
tux@maquina:~/Documentos/temporal/bash> sh renombrar.sh fichero_a_cambiar.txt fichero_cambiado.txt

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!!

krovikan
18-Jun-2022, 05:34
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

karlggest
18-Jun-2022, 07:50
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!

krovikan
18-Jun-2022, 09:40
En el primer código, ejecutas "mp4.sh". En el último código, ejecutas "mp4".

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

victorhck
18-Jun-2022, 10:03
mi apuesta es también por usar un script y ponerlo en /usr/bin por ejemplo...

karlggest
18-Jun-2022, 10:28
Hola!
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
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 :)


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 https://fishshell.com/docs/current/index.html 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.

mi apuesta es también por usar un script y ponerlo en /usr/bin por ejemplo...
No sé si usas fish, pero ¿dónde configurarías los alias?

Salud!!

krovikan
18-Jun-2022, 14:03
Entiendo que no usa .bashrc aunque es posible que al instalarlo tome su configuración. Según https://fishshell.com/docs/current/index.html la configuración respectiva está en .config/fish/config.fish pero, como he dicho, no tengo la menor idea de cómo va 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

DiabloRojo
19-Jun-2022, 00:04
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.

krovikan
19-Jun-2022, 03:06
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 (https://forums.opensuse.org/showthread.php/571385-Alias-con-variables?p=3135257#post3135257) 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

karlggest
19-Jun-2022, 03:31
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!!

krovikan
19-Jun-2022, 03:47
Karl, que me montastes el ordenador hace casi 6 años y sigo sin cambiar su estructura. ;)

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

karlggest
19-Jun-2022, 04:01
Karl, que me montastes el ordenador hace casi 6 años y sigo sin cambiar su estructura. ;)

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!!

DiabloRojo
19-Jun-2022, 07:21
Lo que dice @malcolmlewis no me va o no sé usarlo:


Respecto a lo que dices @DiabloRojo, al final no me he aclarado con la web que me pasastes (y parecía fácil):

En 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:




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).


SaludosEsta 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 (https://ibb.co/JmPbmf9)

krovikan
19-Jun-2022, 07:48
Al 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

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

DiabloRojo
19-Jun-2022, 08:23
Ahora me gustaría arreglar ese $PATH que me trae de cabeza.
La puedes editar o modificar.

La guía de Ubuntu es muy buena: https://help.ubuntu.com/community/EnvironmentVariables

Los archivos ocultos .bashrc, .bash_profile y .profile de tu home de usuario te puede ayudar. Esta mañana no tenia mi .bashrc, ya has visto que funciona y todavía no tengo los otros dos.

ls ~/.*
/home/leches/.bash_history /home/leches/.directory /home/leches/.face /home/leches/.gtkrc-2.0 /home/leches/.wget-hsts
/home/leches/.bashrc /home/leches/.esd_auth /home/leches/.face.icon /home/leches/.gtkrc-2.0-kde4 /home/leches/.Xauthority

karlggest
19-Jun-2022, 09:11
Hola.

Yo también estoy oxidado, espero no cometer errores importantes con tanto cambio en los sistemas GNU/Linux modernos rotfl! Imos aló!

Lo obvio es bash aunque krovikan use fish. Y lo es porque es lo que viene por defecto no sólo en openSUSE: la mayoría de distros también vienen con él. Es un shell conveniente tanto en recursos, facilidad de uso y documentación ¡basta de publicidad!

Lo que parece menos obvio es que bash, como cualquier programa, lee su fichero de configuración al iniciar el programa. Si usamos konsole, esto coincidirá cuando iniciemos konsole, o cuando ejecutemos el programa, bash. Por su parte, si usamos un terminal en modo texto, al concluir el login se ejecuta bash y, por tanto, también se lee su fichero de configuración.


tux@mipc:~> echo $MIVAR

tux@mipc:~> echo "export MIVAR='texto de la variable'" >> .bashrc
tux@mipc:~> echo $MIVAR

tux@mipc:~> bash
tux@mipc:~> echo $MIVAR
texto de la variable
tux@mipc:~>

Hay otras variables que se fueron utilizando con el tiempo para modificar el entorno, sea programando variables, alias, etc. Es posible que a algunos os sobrevivan algunos de ellos de antiguas configuraciones y puede que alguno os resulte obsoleto. Que recuerde en debian usaba .profile, pero en otras distros puede ser algo como .bash_profile.

.bash_profile se lee cuando un usuario se registra en el sistema, y para aceptar un cambio hay que volver a registrarse en el sistema. Francamente no tengo muy claro qué significa eso en un sistema moderno con sesión gráfica -era más evidente en los tiempos en los que se iniciaba sesión con startx, pero entiendo que ese inicio de sesión cuenta también.

No tengo la menor idea de cómo funciona fish, como ya he dicho antes. En la documentación que enlacé ( https://fishshell.com/docs/current/index.html ) ponen un ejemplo de cómo añadir una carpeta ~/linux/bin al PATH. Bien, bastaría borrar linux/ para que debiera funcionar.
Pero modificar el PATH es por conveniencia. Una vez que sabes cuál debe ser, puedes sustituirlo. Supongo que en este caso, la línea sería algo así como:


set -gx PATH ~/bin /usr/local/bin /usr/bin /bin

Añadiendo otras carpetas que pudiera haber en tu sistema.

Espero que esto os sea útil para estas cuestiones.

Salud!!

krovikan
19-Jun-2022, 10:05
Gracias por las respuestas. Encontré la solución que iba a poner cuando vi nuevo post de Karl.

Seguí el enlace de DR de Ubuntu y tras hojear algunas páginas de la ayuda de Ubuntu, busqué en internet hasta que me llevó a donde tendría que haber ido como primera opción: la página de documentación de fish, en concreto esta: https://fishshell.com/docs/current/cmds/fish_add_path.html

En la siguiente captura veis como era mi $PATH original, el comando introducido para añadir otra ruta, el nuevo $PATH y para hacerlo permanente la línea añadida al final del archivo de configuración ~/.config/fish/config.fish:
https://i.imgur.com/ILglrC5.png
A continuación he borrado el script mp4 de /usr/local/bin quedando sólo en el $PATH el de ~/bin. Y funciona, aunque me he encontrado otro escollo.

Nombres normales (sin espacios), perfecto. Pero con cosas como esta, error:


~/Descargasmp4 So\ I\ Tried\ Elden\ Ring.mp4 MM.mp4 ✔  32s  18:09:47
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
So: No such file or directory

Algo me dice que son las \ (porque si el primer archivo se llama LL.mp4, por ejemplo, ni se queja) pero no sé como escapar de ellas. He probado:


mp4 'So\ I\ Tried\ Elden\ Ring.mp4' MM.mp4

y


mp4 "So\ I\ Tried\ Elden\ Ring.mp4" MM.mp4

pero no funciona. He estado mirando el resto de documentación de Fish pero no sé cómo solucionarlo.


Saludos

PD: Iba a publicarlo así pero he estado mirando más cosas como modificar el script a fish cambiando la primera línea pero ya ni funciona.

Tal y como está me funciona (sin cambiar a bash, desde fish directamente) salvo por el error descrito con las \. El script, lo recuerdo:


~/Descargascat ../bin/mp4 ✘ 255  6s  18:55:00
#!/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

Para que fuera de fish sería cambiar la primera línea por:


#!/usr/bin/env fish

De esa forma me sale el error Trailing options were found on the commandline.
y el script no funciona. :messed:

karlggest
19-Jun-2022, 11:12
Hola.

El espacio tiene un significado especial en bash y es que puede usarse como separador de los argumentos. Por ejemplo, si quieres crear tres carpetas puedes ejecutar un comando como éste: mkdir undir dosdir tresdir

Eso puede ser un pequeño quebradero de cabeza al crear tus scripts. En el comando anterior, tienes que el arg[0] es mkdir, el arg[1] es undir, el arg[2] es dosdir y el arg[3] es tresdir. Así que ¿cómo hacer con los nombres de ficheros que incluyen espacios?

Una solución simple es pasar cualquier cadena de texto que pueda contener espacios como literal de cadena, lo que se hace entrecomillando con comillas simples o dobles. Así en:


micomando "un nombre de fichero.txt" "otro nombre de fichero.txt"

el arg[0] es: micomando, el arg[1] es: un nombre de fichero.txt, y el arg[2] es: otro nombre de fichero.txt.

Por suerte, openSUSE y su bash son lo suficientemente listos para saber que si escribes " y pulsas el tabulador, sigues queriendo escribir el nombre del fichero o carpeta de turno.

Dicho esto, aclarar que las comillas convierten su contenido en un literal de cadena, esto es, una ristra de caracteres de texto, sean estos cuales sean. Así, mi\ fichero.txt es un nombre que incluye la barra \ y no, como esperabas, simplemente mi fichero.txt

En las páginas
https://ajaxhispano.com/ask/pasar-una-cadena-con-espacios-como-argumento-de-funcion-en-bash-6480/ (https://ajaxhispano.com/ask/pasar-una-cadena-con-espacios-como-argumento-de-funcion-en-bash-6480/)
https://forum.elhacker.net/scripting/bash-problemas-con-parentesis-y-espacios-en-nombres-de-fichero-solucionado/
https://espaciolinux.com/foros/programacion/problema-con-ficheros-que-contienen-espacios-bash--t44446.html
http://deckerix.com/blog/solucionar-el-problema-de-los-ficheros-con-espacios-en-listado-de-directorios-en-bash/
https://espaciolinux.com/foros/programacion/solucionado-bash-problemas-con-espacios-en-nombre--t50619.html

le dan vueltas a esta cuestión. Una forma adicional es tomar todo el comando como un único literal y procesarlo en el script (el literal completo, si no recuerdo mal, es $*).

Esto en cuanto a bash. De nuevo, ni idea de cómo hacerlo en fish. Yo no contaría que lo que hagas en bash funciona en fish (pero el script funcionará en fish porque realmente se ejecuta en bash, para eso se lo pones al principio). Fish es probable que tenga sus propias formas de resolver esto, pero voy mayor para buscar rotfl!

Veamos: tu línea es:

mp4 So\ I\ Tried\ Elden\ Ring.mp4 MM.mp4

y yo probaría:

mp4 "So I Tried Elden Ring.mp4" MM.mp4

Una sugerencia adicional: yo no pondría el nombre del fichero resultante como argumento y lo crearía dentro del script. Eso haría sencillo generalizar el script para hacerlo con varios ficheros en lugar de uno a uno, e incluso en el caso de uno solo sería más sencillo el comando completo: mp4 mi vídeo del cumpleaños fatídico.avi (o bien, más sencillo: mp4 "mi vídeo del cumpleaños fatídico.avi")

Salud!!

krovikan
19-Jun-2022, 11:43
Nada.

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


Saludos

victorhck
19-Jun-2022, 11:56
No sé si usas fish, pero ¿dónde configurarías los alias?

Salud!!

Sí uso fish. Los alias en fish se añaden en:

~/.config/fish/config.fish

victorhck
19-Jun-2022, 12:26
Por cierto he probado a crear una función en fish con tu comando y me funciona y con archivos con espacios (hay que escapar los espacios con la barra invertida)

Prueba a usar el editor de funciones de fish, para esto ejecuta→ funced mp4 (si tienes configurada la variable $EDITOR te la abrirá con el editor que tengas configurado, en mi caso vim) y dentro escribes:

function mp4 --description 'convierte un video de entrada a uno de salida en mp4' --argument vid_entrada vid_salida
ffmpeg -i $vid_entrada -b:a 128k -c:a aac -c:v libx264 -framerate 29 -threads 2 $vid_salida
end

Al abrir el editor, ya te lo abre por defecto con el inicio de function y con el end, así que añade lo que te he puesto antes.

y después ejecutas funcsave mp4 para que la guarde y ya la puedas ejecutar y usar.

(la otra opción a todo esto es ir a ~/.config/fish/functions/ y crear un archivo mp4.fish con el código que te he puesto antes. Guardar y cerrar la terminal y volverla a abrir)

Ahora ya tienes la función y puedes usarla con un archivo llamado archivo video.avi y convertirlo a archivo convertido.mp4:

mp4 archivo\ video.mp4 archivo\ convertido.mp4

comenta si te funciona...

Saludos.

krovikan
19-Jun-2022, 13:56
Fabuloso Víctor. :)

He creado la función a mano (sin funced) en el directorio de funciones y he puesto una copia a buen recaudo aunque ~/.config sea mio:


~/Descargascat ~/.config/fish/functions/mp4.fish ✔  22:39:45
function mp4 --description 'convierte un video de entrada a uno de salida en mp4' --argument vid_e
ntrada vid_salida
ffmpeg -i $vid_entrada -b:a 128k -c:a aac -c:v libx264 -framerate 29 -threads 2 $vid_salida
end

Un ejemplo satisfactorio de la función:


~/Descargasmp4 So\ I\ Tried\ Elden\ Ring.mp4 So\ I\ Tried\ Elden\ Ring\ v2.mp4 ✔  22:39:59
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 'So I Tried Elden Ring.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 @ 0x557c5fc1d7c0] using SAR=1/1
[libx264 @ 0x557c5fc1d7c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x557c5fc1d7c0] profile High, level 4.0, 4:2:0, 8-bit
[libx264 @ 0x557c5fc1d7c0] 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 'So I Tried Elden Ring v2.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.78x
video:9477kB audio:1376kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.601
306%
[libx264 @ 0x557c5fc1d7c0] frame I:45 Avg QP:14.32 size: 39456
[libx264 @ 0x557c5fc1d7c0] frame P:883 Avg QP:21.42 size: 6710
[libx264 @ 0x557c5fc1d7c0] frame B:1177 Avg QP:20.00 size: 1702
[libx264 @ 0x557c5fc1d7c0] consecutive B-frames: 18.2% 18.1% 10.8% 52.8%
[libx264 @ 0x557c5fc1d7c0] mb I I16..4: 26.9% 58.4% 14.8%
[libx264 @ 0x557c5fc1d7c0] 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 @ 0x557c5fc1d7c0] 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 @ 0x557c5fc1d7c0] 8x8 transform intra:60.7% inter:48.2%
[libx264 @ 0x557c5fc1d7c0] coded y,uvDC,uvAC intra: 14.4% 22.9% 13.9% inter: 0.8% 1.5% 0.3%
[libx264 @ 0x557c5fc1d7c0] i16 v,h,dc,p: 51% 34% 6% 10%
[libx264 @ 0x557c5fc1d7c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 42% 17% 35% 1% 1% 1% 1% 1% 1%
[libx264 @ 0x557c5fc1d7c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 27% 19% 5% 3% 3% 4% 3% 5%
[libx264 @ 0x557c5fc1d7c0] i8c dc,h,v,p: 71% 16% 10% 4%
[libx264 @ 0x557c5fc1d7c0] Weighted P-Frames: Y:1.1% UV:1.1%
[libx264 @ 0x557c5fc1d7c0] ref P L0: 63.3% 5.9% 19.7% 11.0% 0.0%
[libx264 @ 0x557c5fc1d7c0] ref B L0: 79.1% 17.8% 3.0%
[libx264 @ 0x557c5fc1d7c0] ref B L1: 96.6% 3.4%
[libx264 @ 0x557c5fc1d7c0] kb/s:885.11
[aac @ 0x557c5fc5e420] Qavg: 2280.786

Muchísimas gracias. Ahora está todo perfecto. rotfl!


Saludos

karlggest
20-Jun-2022, 01:33
Hola!!

Bien está lo que bien acaba. Por supuesto, si vas a usar fish como entorno de ejecución es bueno que te familiarices con él.

He curioseado cómo debería quedar el código en bash. En realidad, bastaba con ponerle comillas a los argumentos y pasarlos con el backslace antes del espacio. Así:


#!/bin/bash

ffmpeg -i "$1" -b:a 128k -c:a aac -c:v libx264 -framerate 29 -threads 2 "$2"

Para ejecutarlo,


./conversor.sh mi\ video\ para\ pruebas.avi video.mp4


Salud!!