function - respuestas - Cáscara de pescado: comprobar si se proporciona argumento para la función
johnson r 1996 estadística descriptiva (5)
Al menos en fish 2.1+, puedes nombrar tus argumentos, lo que permite más código semántico:
function fcd --argument-names ''filename''
if test -n "$filename"
open $filename
else
open $PWD
end
end
Estoy creando una función (a continuación) con la que puede proporcionar un argumento, un directorio. Compruebo si $argv
es un directorio con la opción -d
, pero eso no parece funcionar, siempre devuelve verdadero incluso si no se proporcionan argumentos. También probé la test -n $argv -a -d $argv
para probar si $argv
es una operación vacía, pero eso devuelve la test: Missing argument at index 1
error del test: Missing argument at index 1
. ¿Cómo debo probar si se proporciona algún argumento con la función o no? ¿Por qué no funciona la test -d $argv
Desde mi entendimiento, debería ser falso cuando no se proporciona ningún argumento, porque la cadena vacía no es un directorio.
function fcd
if test -d $argv
open $argv
else
open $PWD
end
end
Gracias por la ayuda.
Tal vez no esté relacionado, pero me gustaría agregar otra perspectiva para la pregunta.
Quiero ampliar la información a un alcance más amplio el alcance de probar el código de shell con las bibliotecas desarrolladas en el grupo de pescadores.
Con el mock puede verificar si el comando de apertura se llama de forma segura sin efectos secundarios.
Ejemplo.:
function fcd
if count $argv > /dev/null
open $argv
else
open $PWD
end
end
mock open 0 "echo /$args"
fcd "cool" # echoes cool
mock open 0 "echo /$args"
fcd # echoes $PWD
Es una biblioteca reciente, pero podría ayudar a probar cosas que podrían ser peligrosas, como por ejemplo rm
mock rm 0 "echo nothing would happen on /$args"
rm "some file" # simply echoes the message with a list of the files that would been affected
Espero que ofrezca un punto de vista más claro.
PD: Perdón por la publicidad descarada, pero creo que es una buena idea que sería bueno que los scripts de shell lo adopten, probar y agregar sostenibilidad a los scripts de shell es una locura. :PAG
EDITAR: recientemente noté un error sobre la muestra que publiqué. No use rm *, ya que el asterisco no se trata como un parámetro, en su lugar, fish shell expande el asterisco a la lista de archivos encontrados y el comando solo simula la primera llamada, esto significa que el primer archivo será ignorado por la simulación. pero todos los archivos subsiguientes se borrarán, así que tenga cuidado si prueba la muestra y use un solo archivo para el ejemplo, no para el comodín.
$argv
es una lista , por lo que desea ver el primer elemento, si hay elementos en esa lista:
if begin; test (count $argv) -gt 0; and test -d $argv[1]; end
open $argv[1]
else
open $PWD
end
count
es la forma correcta de hacer esto Para el caso común de verificar si hay argumentos, puede usar su estado de salida:
function fcd
if count $argv > /dev/null
open $argv
else
open $PWD
end
end
Para responder a su segunda pregunta, la test -d $argv
devuelve verdadero si $argv
está vacío, porque POSIX requiere que cuando se pasa un argumento a la test
, debe "Salir de verdadero (0) si $ 1 no es nulo; de lo contrario, salir de falso". Entonces, cuando $ argv está vacío, test -d $argv
significa test -d
que debe salir de true porque -d
no está vacío! Argh!
editar Se agregó un end
faltante, gracias a Ismail por darse cuenta.
if not set -q argv[1]
echo ''none''
else
echo ''yes''
end
De la página de man set
:
set ( -q | --query ) [SCOPE_OPTIONS] VARIABLE_NAMES...
o -q o --query test si los nombres de las variables especificadas están definidos. No genera ningún resultado, pero el estado de salida de los componentes es el número de variables especificadas que no se definieron.