2016-02-28 3 views
1

Внутри функции, как я могу получить имя файла для любого скрипта, называемого этой функцией?zsh: получить имя файла скрипта, вызвавшего функцию

Через быстрое расширение, %x предоставляет имя файла, определяющего функцию. %N содержит имя функции. Как получить имя файла, которое вызвало функцию?

Это было бы полезно, чтобы сообщить о времени выполнения каждого из моих сценариев запуска и т.д .:

~/.zshenv:

function start_timer() { 
    start_time=$(date +%s.%N) 
} 
function stop_timer() { 
    stop_time=$(date +%s.%N) 
    elapsed_time=$((stop_time-start_time)) 
    echo "$SCRIPTNAME took $elapsed_time seconds" 
} 
start_timer 
# initialize env... 
end_timer # "~/.zshenv took 0 seconds" 

~/.zshrc:

start_timer 
# initialize interactive shell... 
end_timer # "~/.zshrc took 2 seconds" 

~/.zlogin:

start_timer 
# initialize login shell... 
end_timer # "~/.zlogin took 2 seconds" 
+0

Здесь [очень похожий вопрос] (http://stackoverflow.com/questions/9901210), но также нет реального решения. – Lucas

ответ

0

Вы можете передать имя в качестве параметра.

~/.zshenv:

function start_timer() { 
    echo "File: `basename [email protected]`"    # <---- 
    start_time=$(date +%s.%N) 
} 

~/.zshrc:

start_timer $0       # <---- 
# initialize interactive shell... 
end_timer # "~/.zshrc took 2 seconds" 

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

Мой тест:

File: aliases.zsh 
took 0.0018649101257324219 seconds 

И - если вы звоните скрипты сами вы также можете использовать time в качестве команды префикса для печати их время выполнения.

$ time touch x 
touch x 0.00s user 0.00s system 7% cpu 0.019 total 
+0

При инициализации zsh '$ 0' является просто' zsh' в каждом файле запуска. Он работал бы, если бы я передал имя скрипта функции напрямую, например 'end_time $ {(%): -% x}', но вы можете понять, почему я бы не использовал это при каждом вызове :) – mgiuffrida

Смежные вопросы