212 lines
19 KiB
Plaintext
212 lines
19 KiB
Plaintext
|
|
Episode: 1843
|
||
|
|
Title: HPR1843: Some Bash tips
|
||
|
|
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr1843/hpr1843.mp3
|
||
|
|
Transcribed: 2025-10-18 10:00:21
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
This is HPR Episode 1843 entitled Some Bash Tips, and in part of the series, Bash Cripting.
|
||
|
|
It is hosted by Dave Morris, and in about 21 minutes long, the summer is a few useful
|
||
|
|
Bash features that may not be well known.
|
||
|
|
This episode of HPR is brought to you by AnanasThost.com.
|
||
|
|
Get 15% discount on all shared hosting with the offer code HPR15, that's HPR15.
|
||
|
|
Get your web hosting that's honest and fair at AnanasThost.com.
|
||
|
|
Hello everyone, this is Dave Morris. I've got a show for you today which I thought might
|
||
|
|
be of interest to some people, and it's about Bash. I've called it some Bash Tips, and
|
||
|
|
I'm going to talk about three Bash commands, which I'm not sure if they are as popular
|
||
|
|
as they used to be. You've heard me talk about this sort of thing before I'm a command line
|
||
|
|
user, and I have been using the Bash command line or the pre-decessors for quite some
|
||
|
|
time, and I wanted to talk about three commands related to directory movement, and they
|
||
|
|
are called push-d, pop-d, and does, D-I-R-S. So I've structured my full note, I've got
|
||
|
|
some long notes here, into a sort of basic overview section, in the assumption that if
|
||
|
|
you're interested in this, that might be enough for you, and then there's a more advanced
|
||
|
|
section, which goes into more of the guts of this stuff, so you're at liberty to skip
|
||
|
|
that if you want to, I warn you when I'm getting onto that bit, so you can fast forward if
|
||
|
|
that suits you. So let's start with push-d, push-d is normally followed by a directory name,
|
||
|
|
and it just changes directory like using CD, but it does a bit more than that. It saves
|
||
|
|
the previous directory, and the directory you've moved to in a stack. So I've given an
|
||
|
|
example of logging in, being in your home directory, I've typed PWD in my example to show
|
||
|
|
that I'm in my home directory, then I type push-d documents, and then I see a line that
|
||
|
|
starts with tilde slash documents, space tilde, and what that indicates is that that's
|
||
|
|
the stack, that's the representation of the stack, and the first element on the left
|
||
|
|
is the directory I'm currently in, that's the top of the stack, and the second one is
|
||
|
|
the directory I was in before, the tilde, that's my home directory. So it's showing it
|
||
|
|
in this way, which you need to get your head around a bit, but there are better ways
|
||
|
|
of showing it, which I'll come on to in a moment or two. So that's how you would change
|
||
|
|
directory, you can keep on pushing and pushing and pushing and moving on back in directories,
|
||
|
|
but when you want to go back to a directory, there's a complimentary command, pop-d, p-o-p-d,
|
||
|
|
this moves back to the previous directory. So in other words, it takes the topmost directory
|
||
|
|
off the stack, the one that you're currently in, takes it off the stack, and changes directory
|
||
|
|
to the one that's now the top, so effectively the second one working down the stack. In my
|
||
|
|
example, in the notes, I'm in the document directory, I type pop-d, and I get a line that
|
||
|
|
shows just a single tilde, and when I type p-w-d, I see I'm back in my home directory. You
|
||
|
|
can see what it's doing there. The stack can be any lengthy one, I think, I don't know
|
||
|
|
that there are any particular limits. There is another command which doesn't do any
|
||
|
|
movement, but it tells you about where you are in this stack, and things about the stack,
|
||
|
|
and it's doors, D-I-R-S, and it can display the directory's stack, and when you normally
|
||
|
|
type it, it shows it in that left to right format, so it shows the directory currently
|
||
|
|
in on the left, then the next one down the stack to the right of that, and the next one
|
||
|
|
to the right of that, and so forth. There's a nicer way of using it, or to my mind,
|
||
|
|
anyway, a nicer way of using it, which is to use an option, minus V, minus V to the doors
|
||
|
|
command shows the stack as a vertical list with index numbers. So, I've given an example,
|
||
|
|
where my example was before I was in the top level directory, so I pushed the documents
|
||
|
|
again, go back down to the documents directory, and there's another directory in there called
|
||
|
|
subder, just made for this demonstration, really, push D into that. So, what I get back
|
||
|
|
from the second push D is tilde slash documents slash subder, which is the directory I'm
|
||
|
|
in just now, followed by tilde slash documents, followed by tilde. If I then type doors minus
|
||
|
|
V, D, E, R, S, space, minus V, then I see a list that shows zero and tilde document slash
|
||
|
|
subder, one, tilde documents, two, tilde each on the separate line, and in a stack. So,
|
||
|
|
it shows it as the stack, and the top of the stack is the zero element, and it's the
|
||
|
|
one at the top of the list. So, the horizontal display is what's normally shown after
|
||
|
|
push D or a pop D, but you can force the vertical listing using the doors command. Okay, well,
|
||
|
|
that's the three commands in brief. Now, I'm going to dig down deeper and start talking about
|
||
|
|
them in more detail. They do have quite a lot more features than we've seen so far, and what I've
|
||
|
|
done is I've taken the man pages for these three commands, and I have reformatted them to make
|
||
|
|
to my mind a little bit more readable, and I've stuck them on the end of my full notes, which will
|
||
|
|
be available on the website naturally. The first point is you can use push D to add a directory to
|
||
|
|
the directory stack without changing to that directory. Use the minus A in option to do this.
|
||
|
|
So, my example shows we're back at the top directory again, the whole directory, and we type push D
|
||
|
|
space minus N space tilde slash documents. Didn't actually need the tilde slash, just documents
|
||
|
|
would have been enough because it would have been interpreted as the document's directory
|
||
|
|
immediately below where we currently are, but this is just me being pedantic. So, what we see in
|
||
|
|
this stack is tilde, which is the home directory, where we currently are. We haven't moved, followed by
|
||
|
|
tilde slash documents. What's happened is that the document's directory has been placed underneath
|
||
|
|
element zero on the stack, has been made into element one on the stack. So, the next example shows
|
||
|
|
push D, space minus N, space tilde slash documents slash subder. So, we're still in the top level
|
||
|
|
directory, so we're referring to the documents that directory with the sub directory underneath it,
|
||
|
|
and we add that to the stack, and that gets put at position one. So, when we see the horizontal
|
||
|
|
display of the stack, we see tilde, space, tilde slash documents slash subder, space tilde slash
|
||
|
|
documents. Now, type does minus V to show the thing vertically, and we see the same things numbered
|
||
|
|
zero one two. Now, the order of this stack is not the same as it was when we we visited these
|
||
|
|
directories by doing a push D down into each one, without the minus N. Now, this could be useful if
|
||
|
|
you wanted to preload the stack without actually visiting those directories, but you put them there,
|
||
|
|
because you wanted to visit them at a later stage. Another feature of push D is that you can
|
||
|
|
fiddle around with the order of the stack. Well, to be more precise, you can rotate it as if it's
|
||
|
|
a loop, so you can take the element one and push it to the top, and that causes element zero to go
|
||
|
|
right round to the bottom. So, it's a loop that rotates, and you can rotate it in either direction.
|
||
|
|
This is done using options that are written in the manual pages as plus N and minus N, but in this
|
||
|
|
case, N means an integer number, not the letter N. So, you'd use something like push D plus two,
|
||
|
|
that means rotate the stack so that entry number two counting from the left, or as you see it when
|
||
|
|
you're when you're number it with does minus V, it gets raised to the top, and then everything else
|
||
|
|
rotates appropriately, and I've shown it in an example, push D plus two rotates things so that
|
||
|
|
the element number two, in which we saw in the previous example, gets pushed at the top, so you get
|
||
|
|
tilde slash documents at the top, then after documents, if you looped round, would be tilde,
|
||
|
|
so you see that next, and after that is tilde slash documents slash subter. You can also use negative
|
||
|
|
numbers, that causes the rotation to have in the same direction, but it refers to the elements
|
||
|
|
starting from the bottom. You might find this confusing, I sure as hell do, and I've no
|
||
|
|
don't think I've ever used this, I've certainly done all this push D business of shuffling things round
|
||
|
|
in the in the past, that was the way I used to build up a stack of directories and then move
|
||
|
|
about between them, because if you do that, you don't ever lose them, they stay in the stack,
|
||
|
|
you just move them into different positions, but the negative one I've never found was all that
|
||
|
|
useful as probably shows my limitations of my brain, but still find it a bit weird. So my example,
|
||
|
|
I've used push D minus zero, what that says is minus zero means start counting at zero from the bottom
|
||
|
|
of the stack, and the way we left the stack, the previous example was with a document slash subter
|
||
|
|
at the bottom of the stack, element two if you're counting from from the top, so minus zero means
|
||
|
|
the bottom most one, it says bring it up to the top, but bringing it up to the top rotates the other
|
||
|
|
ones down appropriately, if you follow me, so it's when you do that, you see the directories listed
|
||
|
|
as, this is doing using the left to right notation, tilde slash document slash subter, that's the
|
||
|
|
one we just asked for to be on the top, then that's followed by tilde documents, which is the next one
|
||
|
|
in the loop of documents followed by tilde, you can't change the order, you can't swap tilde
|
||
|
|
documents until the document slash subter, you can't do that, you're just rotating this round
|
||
|
|
in a ring, I have to admit, I had never fully understood this, at least if I did, I'd forgotten it,
|
||
|
|
so in preparing for this show, I think I've got my head round it now, I've shown in this example
|
||
|
|
another option to the doors command, doors minus p, that simply lists the directories without
|
||
|
|
bothering to number them, given that the numbering can go either way depending on whether you're
|
||
|
|
using plus n or minus n in push d, push d, then it could be advantageous to do it that way, there's
|
||
|
|
no way of doing the numbering in the negative direction, actually it would be fun to write something
|
||
|
|
to provide that capability, I think about doing that one day, so that's pretty much all of
|
||
|
|
what push d can do, now let's look at pop d in a bit more detail, pop d of course again is documented
|
||
|
|
in my modified man page, it also takes a minus n where the actual letter n, which allows
|
||
|
|
to manipulate the stack without changing directory, so if we assume, I've refreshed everything,
|
||
|
|
I'm starting at the top level directory now, so first of all do a push d of documents, so my stack
|
||
|
|
consists of tilde slash documents followed by tilde, then if I add into that subter as I did
|
||
|
|
before, so I've got slash document slash subter on the top and then documents then tilde,
|
||
|
|
if I then do pop d minus n, what would that do, would you think?
|
||
|
|
Well the answer is it removes, removes, that is, we're not rotating now, it actually removes
|
||
|
|
from the directory stack the first element, element one, I'm not very good at this,
|
||
|
|
zero base counting stuff, it takes away tilde slash documents and you're left with
|
||
|
|
tilde slash document slash subter followed by tilde, so it doesn't actually change the
|
||
|
|
directory you're in, it doesn't change the top of the stack but it kills the next one down,
|
||
|
|
so I then show using pop d without any arguments, which we saw earlier on means
|
||
|
|
throw away the top of the stack and change directory to the next one down, which was
|
||
|
|
the tilde, so we're now at the home directory again, so I made a note here that pop d minus n
|
||
|
|
always takes away element one from the stack counting in the normal way, counting from left
|
||
|
|
to right, whereas plain pop d removes the zeroth element of the stack, we could also use the plus
|
||
|
|
and minus integer thing, so pop d plus three means to remove directory three from the stack counting
|
||
|
|
from the left and then and possibly confusingly pop d minus two means remove the the one counting
|
||
|
|
from the right to two positions from the right, this is not stack rotations I've pointed out in the
|
||
|
|
but explicit deletion, so I've got an example here which looks a bit daunting, but all I did was
|
||
|
|
create a top level directory called test one, when it with init another directory called test two
|
||
|
|
within that test three within that test four, so I just do a push d to each one of those in turn
|
||
|
|
and end up with a stack of zeroth element being tilde slash test one, test two, test three,
|
||
|
|
test four and so on down to the fourth element four I should say which is tilde, okay, I won't read
|
||
|
|
these out because you'll get so stunningly bored, so I probably, so if I then type pop d plus three
|
||
|
|
or do expect that to do, well that means take away the element which is numbered three in that
|
||
|
|
doors minus v listing that I included, so that was tilde slash test one, so do that and there you
|
||
|
|
go, tilde slash test one has been taken out of the directory stack, so then I did pop d plus zero,
|
||
|
|
that means take away the zeroth element which it does, but because you've now removed it and
|
||
|
|
that's normally the directory you're in, it changes directory for you to the one that's now become
|
||
|
|
the top of the stack which is test one slash test two slash test three, then finally in this
|
||
|
|
this example I use the negative integer business pop d minus one takes the element which is one
|
||
|
|
position counting from zero from the right, so in the stack we've got test one, test two, test three
|
||
|
|
followed by test one, test two followed by a home directory tilde, so counting minus one
|
||
|
|
skips over the tilde and goes to test one, test two, so we remove that and all we're left with is
|
||
|
|
test one, test two, test three and then tilde, shouldn't it call these test ones and things,
|
||
|
|
it would have turned a better, if that just called them one, two, three wouldn't it, oh well,
|
||
|
|
seem like a good idea at the time, anyway I do a doors minus v at the end to show you what's left,
|
||
|
|
just to prove the point, finally let's look at the doors command in a bit more detail and again
|
||
|
|
I've put a version of the man page in the notes and you've seen me using doors minus v to show the
|
||
|
|
directory stack in this what I think to be a more readable form with numbers and you've also
|
||
|
|
seen me using the minus p option where it does the same but without numbers, there's also a minus
|
||
|
|
l option which lists the directories but gives the full path name so it replaces the tilde
|
||
|
|
with the explicit home directory, haven't demonstrated that, you can with the doors command just
|
||
|
|
clear the entire directory stack using minus c, it just drops the whole thing
|
||
|
|
and but it leaves you in the directory you were before you issued the command, it doesn't,
|
||
|
|
doesn't move you around within the stack in any any sense it just blitzes it, now you can use
|
||
|
|
the doors command to make it clear to yourself which directory you will get if you use one of
|
||
|
|
this plus or minus integer options and I've done an example here to demonstrate this, what I've
|
||
|
|
done is I've gone back to the top level directory then I've gone all the way through this test one,
|
||
|
|
two, three business again, I've just done the wall on the same line pushing in the
|
||
|
|
wall onto the stack so we end up with a stack of all these directories as before but I won't read
|
||
|
|
out then I typed doors plus three meaning tell me which directory is number three on the stack in
|
||
|
|
other words it's it's number three counting from zero from the left and the answer is tilde slash
|
||
|
|
test one and I do a doors minus V so you can improve that that's that's the case so if you
|
||
|
|
were going to type a pop D or a push D or something with a plus three in it it might be useful to
|
||
|
|
use that first just to check that it's going to do what you want it to do then I also do do does
|
||
|
|
minus three just to prove that counting up from the bottom or from the the right if you prefer to
|
||
|
|
think of it in that term gets you to where you want to be so minus three there's three places
|
||
|
|
it knows the three places counting from zero so it shows the directory test one test two test three
|
||
|
|
it's actually hard to say this hope you've got the gist of what I'm trying to to explain you
|
||
|
|
so I hope I haven't driven you away from this rather than attracting you towards it by all of this
|
||
|
|
whiter but I think it can be quite useful now written a short conclusion here why use them what
|
||
|
|
use are they well I actually started using these long time ago pre linux when I was working on
|
||
|
|
older unique systems like Dexaltrix and Sun Sunos and Solaris and HPUX HPUX operating system
|
||
|
|
all of which were versions of Unix that had SH or Bash shells on them and they they did have
|
||
|
|
pop pushed in popdy and some at some point it was real terminals I would been using with these
|
||
|
|
things and so you just had the one you don't have windows at all you just had a terminal so you
|
||
|
|
were you were there was a non graphical display so there was there was times when being
|
||
|
|
able to jump around between um directories in this way was quite fun and it was before the days
|
||
|
|
of terminal emulators and windowed systems and virtual test stops and all these other goodies so
|
||
|
|
I used to be able to since my job entailed often dealing with people's problems as well as doing
|
||
|
|
some development or or system management or something it was often necessary to stop what I was doing
|
||
|
|
and then go and do some something somewhere else in a directory on the system and then come back
|
||
|
|
to what I was doing so it was really useful to be able to use pushd to go to that other place
|
||
|
|
do the thing find the answer or whatever it was and then say right that's dealt with now I can go
|
||
|
|
back to what I was doing and do popdy back to where I'd come from it's I guess it's less of an
|
||
|
|
issue these days I personally tend to have several terminal emulators on several virtual
|
||
|
|
desktops on my workstation and in each terminal emulator I've usually got multiple tabs
|
||
|
|
and I I'm in a different directory on each one and I hop around between tabs and screens and
|
||
|
|
this sort of thing so I tend to use pushed in popdy less but there's on there's occasions where
|
||
|
|
I am wanting to to step away from what I'm doing just to do something else briefly and then come
|
||
|
|
back to it without opening another tab or something and I find it useful to have that in my toolkit
|
||
|
|
so you might find it useful as well hope you do anyway okay that's it bye
|
||
|
|
you've been listening to Heka Public Radio at Heka Public Radio dot org
|
||
|
|
we are a community podcast network that releases shows every weekday Monday through Friday
|
||
|
|
today's show like all our shows was contributed by an hbr listener like yourself if you ever
|
||
|
|
thought of recording a podcast then click on our contributing to find out how easy it really is
|
||
|
|
Heka Public Radio was founded by the digital dog pound and the infonomican computer club
|
||
|
|
and it's part of the binary revolution at binrev.com if you have comments on today's show
|
||
|
|
please email the host directly leave a comment on the website or record a follow up episode yourself
|
||
|
|
unless otherwise stated today's show is released on the creative comments attribution share
|
||
|
|
freedom license
|