Intereting Posts
Используйте awk для печати только поля IP и OPEN port Соединение ведомого ведомого слишком медленное Невозможно перечислить большие каталоги с помощью pureftpd Является ли символическая / софт-ссылка похожей на ярлык / псевдоним на рабочем столе? Повышение производительности TCP по сравнению с гигабитной сетью Имена функций сценария Bash, содержащие двойное двоеточие ‘::’ Почему binutils и gcc необходимо дважды установить в LFS? Безопасно извлекать USB-устройство (любого типа, не только блочные устройства / запоминающие устройства)? Замена stdout на stderr установка dsc30 – python 2.6 сражается назад yum: Как я могу проинструктировать yum установить определенную версию для X Как очистить дублированные записи в файлах SSH known_hosts и authorized_keys? sshfs с подключением по требованию поведение ssh для пользователя root и non-root с использованием простого выражения квантора регулярных выражений в grep

Есть ли команда оболочки или утилита для вывода процесса кэширования?

Надеюсь, это подходящее место, чтобы спросить.

Есть ли инструмент unix, который работает аналогично этому?

# invokes echo, saves to cache (using command with arguments as key), returns "hi" cache 10 echo hi # wait 2 seconds sleep 2 # doesn't invoke echo, from cache returns "hi" cache 10 echo hi # wait 10 seconds sleep 10 # with cache expired, invokes echo, returns "hi" cache 10 echo hi 

Очевидно, что эхо не было бы реальным прецедентом.

В основном кеш STDOUT, STDERR и статус для данной команды + аргументы, поэтому следующий вызов того же процесса не должен повторно запускать его.

Я мог написать сценарий, который это делает, но я задавался вопросом, есть ли в наборе инструментов unix, о котором я не знаю.

Вы можете поместить результат в файл, а затем прочитать его обратно из этого файла …

 tmpDir=/tmp/$$ rm -rf "$tmpDir" mkdir "$tmpDir" echo cmd1 > "$tmpDir"/cmd1_stdout 2> "$tmpDir"/cmd1_stderr echo $? > "$tmpDir"/cmd1_exitcode # Retrieving output of cmd1: ( cat "$tmpDir"/cmd1_stdout ; cat "$tmpDir"/cmd1_stderr 1>&2; exit $(cat "$tmpDir"/cmd1_exitcode) ) 

Из этого мы могли бы определить функцию «кеша». Эта версия нуждается в символе, который мы никогда не будем использовать в качестве аргумента. Например, запятая ",". Вы можете изменить его на строке «IFS =»,

 tmpDir=/tmp/$$ rm -rf "$tmpDir" mkdir "$tmpDir" cache() { IFS=, cmd="$*" if [ -f "$tmpDir/$cmd"_exitcode ]; then cat "$tmpDir/$cmd"_stdout cat "$tmpDir/$cmd"_stderr 1>&2 return $(cat "$tmpDir"/cmd1_exitcode) fi # This line is bash-only: "$@" 2> >(tee "$tmpDir/$cmd"_stderr 1>&2) > >(tee "$tmpDir/$cmd"_stdout) local e=$? echo $e > "$tmpDir/$cmd"_exitcode return $e } 

Таймаут может быть реализован с помощью «date +% s» и «stat -c% Y»:

 tmpDir=/tmp/$$ rm -rf "$tmpDir" mkdir "$tmpDir" cache() { local timeout=$1 shift IFS=, cmd="$*" if [ -f "$tmpDir/$cmd"_exitcode ]; then local now=$(date +%s) local fdate=$(stat -c %Y "$tmpDir/$cmd"_exitcode) if [ $((now-fdate)) -le $timeout ]; then cat "$tmpDir/$cmd"_stdout cat "$tmpDir/$cmd"_stderr 1>&2 return $(cat "$tmpDir/$cmd"_exitcode) fi fi # This line is bash-only: "$@" 2> >(tee "$tmpDir/$cmd"_stderr 1>&2) > >(tee "$tmpDir/$cmd"_stdout) local e=$? echo $e > "$tmpDir/$cmd"_exitcode return $e } 

Строку «только bash» можно заменить на:

  "$@" 2> "$tmpDir/$cmd"_stderr > "$tmpDir/$cmd"_stdout local e=$? cat "$tmpDir/$cmd"_stdout cat "$tmpDir/$cmd"_stderr 1>&2 

Насколько мне известно, нет стандартного или традиционного инструмента, который работает таким образом. Однако поиск «cache stdout» привел меня к https://github.com/Valiev/cache , который, как представляется, является инструментом, который делает то, что вы хотите.

Я не знаю универсального инструмента для такого кэширования, но я знаю о конкретном инструменте кэширования результата компиляции файлов C или C ++, кэша компилятора ccache .

Это хранит предварительно обработанные источники и скомпилированные файлы объектных кодов и использует хеши на основе как исходного кода, так и сигнатуры компилятора, чтобы выяснить, следует ли использовать кеш или перекомпилировать файл.

Общий кеш для оболочки должен был бы аналогичным образом использовать хэш-скрипт, подпись каждой используемой внешней утилиты и т. Д., А также учитывать, что вывод сценария оболочки может зависеть от времени суток (если он использует date ) и многие другие факторы.

Создание кеша для одной команды не выгодно, особенно для echo поскольку это встроено в большинство оболочек, а дополнительная обработка его для кеширования будет только замедлять работу (если только эхо не было вызвано также большими внешними утилитами с помощью подстановок команд и т. Д. .)

Я не думаю, что это было бы полезно в конце, но, возможно, полезно только в очень специфическом контексте, таком как утилита ccache для кэширования компиляций, что является проблемой, немного ограниченной в своей области.

Наиболее распространенным механизмом кэширования вывода команд в сценариях оболочки является назначение его переменной. Это легко сделать с подоболочкой. Это не заканчивается традиционным кешем, но те, кто пишет сценарии оболочки, чаще всего считают это приемлемым. Вот ваш вышеприведенный скрипт с использованием подоболочки и переменной

 HI=$(echo hi) echo $HI sleep 2 echo $HI sleep 10 echo $HI 

Другой альтернативой является создание функции кеша в сценарии оболочки. Что-то вроде …

 cache() { expiry=$1 cmd=$2- cache=/tmp/{$2-}_cache if test "`find -not -newermt '-30 seconds' -delete ${cache}`"; then $cmd |tee "$cache" else cat "$cache" fi }