Да, поведение ожидаемое. Причина проста в том, что вы использовали двойные кавычки ( «…»
) при определении псевдонима, что позволяет заменять параметры. Это привело к замене $ VARIABLE_B
во время определения псевдонима вместо его выполнения.
По сути, при записи
VARIABLE_B="original"
alias my_alias="print $VARIABLE_B"
zsh
заменит $ VARIABLE_B
перед запуском команды alias
следующим образом:
alias my_alias="print original"
Следовательно, псевдоним my_alias
всегда будет заменяться на оригинал печати
перед выполнением.
Если вы хотите заменить параметр во время выполнения, вы должны заключить его в кавычки ( '…'
) или заключив $
в кавычки \
:
alias my_alias='print $VARIABLE_B'
alias my_alias="print \$VARIABLE_B"
Это установит псевдоним так, чтобы имя переменной оставалось частью команды, а псевдоним my_alias
фактически заменялся на print $ VARIABLE_B
перед выполнением.
Напротив, параметры внутри определения функции не нужно указывать явно, они всегда заменяются только во время выполнения.
Таким образом, при записи
my_function () {
{
print $VARIABLE_A
}
это именно то, что будет сохранено. При запуске my_function
$ VARIABLE_A
будет заменен значением, которое оно имеет в то время.
Просто используйте аргумент в качестве пути. Вы можете использовать простой прием:/path/to/dir/./
— это то же самое, что и /path/to/dir/
, так как ./
означает «текущий каталог». Итак, для этого простого случая вы можете просто сделать:
#!/bin/bash
for i in "$1"./*.mp4; do
ffmpeg -i "$i" "${i%.*}.mp4";
done
Затем запустите скрипт следующим образом:
cd /path/to/mp4; /path/to/script.sh
Или вот так (последняя косая черта обязательна):
/path/to/script.sh /path/to/mp4/
Общий способ сделать это примерно так:
#!/bin/bash
## Assign the 1st argument to the variable "target"
target=$1
## If $target has no value (if $1 was empty), set it to "."
target=${target:="."}
for i in "$target"/*.mp4; do
ffmpeg -i "$i" "${i%.*}.mp4";
done
Переменная на самом деле не нужна, вы можете просто сделать:
#!/bin/sh
for i in ${1-.}/*.mp4; do
echo ffmpeg -i "$i" "${i%.*}.mp4";
done
Или:
#!/bin/sh
if [ -z "$1" ]; then
target="."
else
target="$1"
fi
for i in "$target"/*.mp4; do
ffmpeg -i "$i" "${i%.*}.mp4";
done