Нет, они оба разные. ~
(тильда):Представляет домашний каталог текущего активного пользователя, например:
Предположим, у меня есть две учетные записи пользователей, то есть root, sam.
при входе в систему как root вывод echo ~
будет /root
.
при входе в систему как sam вывод echo ~
будет /home/sam
.
cd
(изменить каталог)
Это команда, используемая для изменения текущего каталога, где она принимает путь в качестве аргумента и меняет каталог в соответствии с этим, например:cd /home/sam/Desktop/
Он изменит текущий каталог на рабочий стол пользователя.
Но когда мы набираем только cd, происходит переход в домашний каталог.
Когда аргументы не указаны, он возвращает вас в каталог, в который вы вошли.
Обходя точную команду, я полагаю, вы хотите что-то вроде этого (с очевидным вводом четырех -строк )?
$ bash looploop.sh
run ffmpeg with arguments 'alpha' and 'beta'
run ffmpeg with arguments 'alpha' and 'charlie'
run ffmpeg with arguments 'alpha' and 'delta'
run ffmpeg with arguments 'beta' and 'charlie'
run ffmpeg with arguments 'beta' and 'delta'
run ffmpeg with arguments 'charlie' and 'delta'
Мы уже знаем, как сделать цикл, так что давайте просто добавим еще один, вложенный в первый. Это само по себе сопоставило бы все входные строки с собой и со всеми парами дважды, поэтому посчитайте строки, чтобы пропустить пары, которые уже будут обработаны.
#!/bin/bash
i=0
while IFS= read a; do
i=$((i + 1))
j=0
while IFS= read b; do
j=$((j + 1))
if [ "$j" -le "$i" ]; then continue; fi
# insert the actual commands here
printf "run ffmpeg with arguments '%s' and '%s'\n" "$a" "$b"
done < vids.list
done < vids.list
Или, как вы сделали, удаляя строки по мере их обработки внешним циклом, это на самом деле короче:
#!/bin/bash
cp vids.list vids.list.tmp
while IFS= read a; do
while IFS= read b; do
if [ "$a" = "$b" ]; then continue; fi
# insert the actual commands here
printf "run ffmpeg with arguments '%s' and '%s'\n" "$a" "$b"
done < vids.list.tmp
sed -i '1d' vids.list.tmp
done < vids.list.tmp
rm vids.list.tmp
Я не уверен, что именно вызывает «слишком много аргументов» в вашем скрипте, но аргументом для -i
является строка в двойных -кавычках с подстановкой команд внутри, поэтому она будет передана как одиночный аргумент дляffmpeg
(с новыми строками из echo
встроенного ). Это не должно приводить к слишком большому количеству аргументов.
А как насчет этого:
readarray -t arr < file
counter=1
for i in "${arr[@]}"; do
for k in "${!arr[@]}"; do
if [[ ! -z "${arr[$k+$counter]}" ]]; then
f1="${i}"
f2="${arr[$k+$counter]}"
ffmpeg -hide_banner -nostats -i "${f1}" -i "${f2}" -filter_complex signature=detectmode=full:nb_inputs=2 -f null - < /dev/null
else
break
fi
done
(( counter++ ))
done