Ubuntu, используя скрипт оболочки для зацикливания программы на Си

Вы хотите, чтобы подстановочные знаки находили путь в любом месте системы. Вы можете сделать это, если правильно укажете шаблон:

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 , которую вы можете использовать вместо длинный путь - лучший вариант. Вы можете комбинировать переменную оболочки с расширением ** , чтобы сэкономить больше времени при вводе текста, если вы часто его используете.

0
21.08.2018, 01:51
3 ответа

Запись в командной строке:

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
2
28.01.2020, 02:23

Это легко сделать с помощью следующего скрипта:

#!/bin/sh
for i in $(seq 1 100); do
 ./myProgram 1
done

Или в варианте с одним -вкладышем:

for i in $(seq 1 100); do./myProgram 1; done

1
28.01.2020, 02:23

В оболочке 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'
0
12.04.2020, 10:47

Теги

Похожие вопросы