[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: alias not working
From: |
Greg Wooledge |
Subject: |
Re: alias not working |
Date: |
Wed, 26 Apr 2023 13:33:45 -0400 |
On Wed, Apr 26, 2023 at 12:21:09PM -0500, Mike McClain wrote:
> I have a non-standard calender file with entries like this:
>
> May 5 '23 Fri 1900 next TASCA dance
>
> May 6 '23 Sat 1800 Cherokee Co. barn dance, CC Expo
>
> I have an alias 'mo' defined as so:
>
> alias mo='m=$(command date "+%b");
> echo; echo Today is $(command date "+%a %-d %b. %Y %-k:%M");
> if [ -z "$1" ]; then
> egrep "^$m" calendar;
> else
> egrep "^$1" calendar;
> fi'
Aliases don't take arguments. "$1" inside this alias will simply be
the script's $1, or your interactive shell's $1, which is very likely
the empty string.
What you want is a function. Functions can be given arguments, which
are accessed as positional parameters ($1 and so on).
unalias mo
mo() {
printf '\nToday is %s\n' "$(date '+%a %-d %b. %Y %-k:%M')"
if [ -z "$1" ]; then
local m=$(date +%b)
egrep "^$m" calendar
else
egrep "^$1" calendar
fi
}
I'll also point out, for the record, two improvements that can be made
here.
1) The printf command can generate timestamps without needing to call
date(1). I'm not sure if all of your date arguments have corresponding
printf %(...)T specifiers, but generally speaking you can get most
of what you want without calling date.
2) Calling date twice in the same function/script can lead to different
results, if time passes between the two calls, or if the system clock
jumps forward, or if you run the program right before midnight, etc.
It's best to get all of the fields you need in a single call to date
(or printf %()T), and parse them out as needed.