Хоча alias
це один із способів зробити це, можна це зробити і за допомогою eval
- це просто те, що ви не так сильно хочете виконувати eval
команду, скільки хочете до оголошенняeval
команд .
Мені подобаються alias
es - я їх постійно використовую, але мені подобаються функції краще - особливо їх здатність обробляти параметри і що їх не обов’язково розширювати в командному положенні, як це потрібно для alias
es.
Тож я подумав, що, можливо, ви також хочете спробувати це:
_time() if set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
$IFS
Трохи в основному про $*
. Важливо, що the ( subshell bit )
is також є результатом розширення оболонки, і для того, щоб розширити аргументи в простежувану рядок, який я використовую "$*"
( eval
"$@"
до речі, якщо ви не впевнені, всі аргументи можна з'єднати на пробіли) . Розділювач розділення між аргументами в "$*"
- це перший байт $IFS
, тому продовжувати його можна, не визначаючи його значення. Таким чином, функція зберігає $IFS
, встановлює його в \n
ewline досить довго , щоб set ... "$*"
в "$3"
, unset
воно що , скидає його значення , якщо вона раніше була.
Ось невеличка демонстрація:
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
Ви бачите, що я поклав дві команди на значення $TIME
там - будь-яке число добре - навіть жодне - але будьте впевнені, що воно ухилено та цитується належним чином - і те саме стосується аргументів _time()
. Всі вони будуть об'єднані в єдиний командний рядок, коли вони будуть виконані, але кожен аргумент отримує свою \n
лінію ewline, і тому їх можна буде розповсюдити порівняно легко. Або ж ви можете згрупувати їх усі за одне, якщо вам подобається, і розділити їх на \n
ewlines або напівколонки або що-у вас є. Просто переконайтеся, що один аргумент являє собою команду, якій вам буде зручно вводити свій власний рядок у сценарій, коли ви викликаєте його. \(
, наприклад, це добре, якщо з часом його слідкують \)
. В основному нормальні речі.
Коли eval
подається вищезазначений фрагмент, він виглядає так:
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
І його результати виглядають як ...
ВИХІД
+++ echo any number of subshells
++ echo 'any number of subshells'
any number of subshells
++ command -V time
time is a shell keyword
++ hash time
bash: hash: time: not found
real 0m0.003s
user 0m0.000s
sys 0m0.000s
++ set +x
hash
Помилка вказує на те, що я не мають /usr/bin/time
встановлений (бо у мене немає) , і command
давайте нам знати цей час працює. Проведення трейлінгу set +x
- це ще одна команда, що виконується після time
(що можливо) - важливо бути обережним із командами введення під час eval
чого-небудь.