[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/
From: |
Ken Irving |
Subject: |
Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes? |
Date: |
Mon, 19 Oct 2015 16:22:44 -0800 |
User-agent: |
Mutt/1.5.20 (2009-06-14) |
On Mon, Oct 19, 2015 at 12:49:25PM -0700, Linda Walsh wrote:
...
> I observe similar inconsistencies and confusion around
> the use of 'dynamic vars' -- not really being global, not really
> being local, but supposedly on some dynamic frame, "somewhere",
> but not anywhere they've been declared or used.
Understanding dynamic (as opposed to static) variables is pretty key to
understanding how bash works, but the manual doesn't seem to even address
the issue, other than perhaps this line in the section about 'local':
When local is used within a function, it causes the variable name
to have a visible scope restricted to that function and its children.
The children referred to are functions called from the function, but which
are otherwise in the global namespace, so that a child of one function
might be separately a child of a different function. I kind of like
the way it works, but it's probably confusing if one is more used to
(or thinking of) static variable scoping, which is much more common in
many languages.
I find it convenient to declare most variables using local, to the extent
of putting the main code in an explicit (and somewhat redundant) main()
function, called by main "$@" at the end of the script.
Here's an example utility function (to split stuff into an array) that
relies on the calling functions to declare the array variable V:
split() { local IFS=$1; shift; V=($*); } # SEP ARGS...
foo() {
local -a V
split , "some,comma,separated,words"
printf "%s\n" "${V[@]}"
...
}
bar() {
local -a V
split ' ' "some space separated words"
...
}
baz() {
split : "some:colon:separated:words"
...
}
The V seen by split() (but alas, not declared within it) is a distinct
variable for foo() and bar(). baz() would cause a global V to be
defined implicitly (from within split()), which I'd tend to avoid.
Ken
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?, (continued)
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?, Greg Wooledge, 2015/10/19
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?, Linda Walsh, 2015/10/19
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?, Greg Wooledge, 2015/10/19
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?, Bob Proulx, 2015/10/19
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?, Linda Walsh, 2015/10/21
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?, Pierre Gaston, 2015/10/22
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?, Bob Proulx, 2015/10/23
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?, Greg Wooledge, 2015/10/26
- Re: Design question(s), re: why use of tmp-files or named-pipes(/dev/fd/N) instead of plain pipes?,
Ken Irving <=