Вы хотите, чтобы подстановочные знаки находили путь в любом месте системы. Вы можете сделать это, если правильно укажете шаблон:
cd /**/thedirectoryiwanttogointo
будет работать в zsh и fish по умолчанию, в Bash, если вы сначала shopt -s globstar
, в tcsh, если вы установите globstar
, в ksh93, если вы установите -o globstar
, в yash
, если вы установите -o extended-glob
.
Это работает, потому что подстановочный знак используется в абсолютном пути, начинающемся с /
, а не относительно текущего каталога, и когда вы выбираете использование шаблона **
, он расширяется в любое количество подкаталогов.
Хотя это будет работать, это займет очень много времени . Ваша оболочка должна искать соответствующий файл (ы) по всей вашей системе. Вы можете сократить это количество, предоставив более длинный префикс, чтобы сократить больше пространства поиска:
cd /home/pulsar/**/thedirectoryiwanttogointo/
Чем дальше вы углубитесь, тем меньше придется выполнять поиск. Если дерево каталогов довольно разреженное, это не займет много времени и действительно практично в использовании. Завершающий /
гарантирует, что расширение выполняется только до каталога, что устраняет одну разновидность неоднозначности, которая может возникнуть.
Если найдено более одного совпадения, результат будет зависеть от вашей оболочки. Bash и fish переключатся на первое совпадение по алфавиту, игнорируя двусмысленность. tcsh и yash сообщат об ошибке. zsh и ksh интерпретируют это как попытку использовать одну из своих расширенных функций переключения каталогов и , вероятно, сообщают об ошибке.
Если вы, вероятно, будете использовать один и тот же каталог несколько раз, поместив родительский в CDPATH
или создав переменную оболочки $ FOO
, которую вы можете использовать вместо длинный путь - лучший вариант. Вы можете комбинировать переменную оболочки с расширением **
, чтобы сэкономить больше времени при вводе текста, если вы часто его используете.
Запись в командной строке:
i=0; while [ $((i+=1)) -le 100 ]; do./myProgram 1; done
Предполагая, что в вашей IFS нет чисел или просто укажите как "$ ((i+=1 ))"
Или (с ksh, bash, zsh)
for i in {1..100}; do./myProgram 1; done
Это легко сделать с помощью следующего скрипта:
#!/bin/sh
for i in $(seq 1 100); do
./myProgram 1
done
Или в варианте с одним -вкладышем:
for i in $(seq 1 100); do./myProgram 1; done
В оболочке zsh
:
repeat 100 do./myProgram 1; done
или
repeat 100 do
./myProgram 1
done
Петля repeat
имеет следующую общую форму:
repeat word do list done
где word
расширяется и обрабатывается как арифметическое выражение, которое сообщает оболочке, сколько итераций нужно выполнить, и где list
— это список команд, которые должны выполняться на каждой итерации (список команд всегда завершается знаком конца команды, например ;
или новой строкой ).
Изbash
:
zsh -c 'repeat 100 do./myProgram 1; done'