2017-01-20 2 views
3

Я хочу псевдоним ГНУ-дата gdate к date, когда программа работает на макинтошАлиас потерял в сценарии

#!/bin/bash 
if [[ $(uname) -eq 'Darwin' ]]; then 
    alias date="gdate" 
    echo 'you are on a mac!' 
    type date 
fi 
# rest of the program 

Учитывая этот код, если я запускать Int непосредственно на терминале он печатает:

you are on a mac! 
date is an alias for gdate 

Но если я бегу сам скрипт как ./test.sh в отпечатках:

you are on a mac! 
date is /bin/date 

Почему псевдоним не применяется к скрипту?

+0

try: source test.sh – dormi330

+0

Если вы задали 'shopt -s expand_aliases', то псевдонимы расширяются в неинтерактивных оболочках, но ответ от chepner имеет больше применений, чем просто замена псевдонима – Petesh

ответ

6

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

if [[ $(name) -eq Darwin ]]; then 
    date() { gdate "[email protected]"; } 
    echo 'you are on a mac!' 
    type date 
fi 
+0

, это сработало как шарм. Однако мне пришлось поставить '$ @', чтобы передать gdate список аргументов. Будет ли он работать только с '@'? – dinigo

+0

Нет; это опечатка с моей стороны. '' $ @ "' требуется. – chepner

2

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

Однако, есть вещи, которые вы не можете сделать с помощью функции, в первую очередь что-нибудь, имеющее отношения к модификации позиционных параметров контекста вызова, и вы можете заставить расширение псевдонима в сценарии оболочки, обеспечивая соответствующую опцию:

shopt -s expand_aliases 

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

+0

это здорово, и поскольку я работаю с zsh, это решает пару общих «странных поведений». – dinigo