Using the result of a command as an argument in bash?

BashCommand Line

Bash Problem Overview


To create a playlist for all of the music in a folder, I am using the following command in bash:

ls > list.txt

I would like to use the result of the pwd command for the name of the playlist.

Something like:

ls > ${pwd}.txt

That doesn't work though - can anyone tell me what syntax I need to use to do something like this?

Edit: As mentioned in the comments pwd will end up giving an absolute path, so my playlist will end up being named .txt in some directory - d'oh! So I'll have to trim the path. Thanks for spotting that - I would probably have spent ages wondering where my files went!

Bash Solutions


Solution 1 - Bash

The best way to do this is with "$(command substitution)" (thanks, Landon):

ls > "$(pwd).txt"

You will sometimes also see people use the older backtick notation, but this has several drawbacks in terms of nesting and escaping:

ls > "`pwd`.txt"

Note that the unprocessed substitution of pwd is an absolute path, so the above command creates a file with the same name in the same directory as the working directory, but with a .txt extension. Thomas Kammeyer pointed out that the basename command strips the leading directory, so this would create a text file in the current directory with the name of that directory:

ls > "$(basename "$(pwd)").txt"

Also thanks to erichui for bringing up the problem of spaces in the path.

Solution 2 - Bash

This is equivalent to the backtick solution:

ls > $(pwd).txt

Solution 3 - Bash

To do literally what you said, you could try:

ls > `pwd`.txt

which will use the full pathname, which should be fine. Note that if you do this in your home directory, which might be in /home/hoboben, you will be trying the create /home/hoboben.txt, a text file in the directory above.

Is this what you wanted?

If you wanted the directory to contain a file named after it, you would get the basename of the current directory and append that with .txt to the pwd.

Now, rather than use the pwd command... why not use the PWD environment variable?

For example:

ls > $PWD.txt

or

ls > ${PWD}.txt

is probably what you were trying to remember with your second example.

If you're in /home/hoboben and you want to create /home/hoboben/hoboben.txt, try:

ls > ${PWD}/${PWD##*/}.txt

If you do this, the file will contain its own name, so most often, you would remedy this in one of a few ways. You could redirect to somewhere else and move the file or name the file beginning with a dot to hide it from the ls command as long as you don't use the -a flag (and then optionally rename the resulting file).

I write my own scripts to manage a directory hierarchy of music files and I use subdirectories named ".info", for example, to contain track data in some spare files (basically, I "hide" metadata this way). It works out okay because my needs are simple and my collection small.

Solution 4 - Bash

I suspect the problem may be that there are spaces in one of the directory names. For example, if your working directory is "/home/user/music/artist name". Bash will be confused thinking that you are trying to redirect to /home/user/music/artist and name.txt. You can fix this with double quotes

ls > "$(pwd).txt"

Also, you may not want to redirect to $(pwd).txt. In the example above, you would be redirecting the output to the file "/home/user/music/artist name.txt"

Solution 5 - Bash

The syntax is:

ls > `pwd`.txt

That is the '`' character up underneath the '~', not the regular single quote.

Solution 6 - Bash

Using the above method will create the files one level above your current directory. If you want the play lists to all go to one directory you'd need to do something like:

#!/bin/sh

MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.txt

Solution 7 - Bash

to strip all but the directory name

ls >/playlistdir/${PWD##/*}.txt

this is probably not what you want because then you don't know where the files are (unless you change the ls command)

to replace "/" with "_"

ls >/playlistdir/${PWD//\//_}.txt

but then the playlist would look ugly and maybe not even fit in the selection window

So this will give you both a short readable name and usable paths inside the file

ext=.mp3 #leave blank for all files
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHoboBenView Question on Stackoverflow
Solution 1 - BashJohn CalsbeekView Answer on Stackoverflow
Solution 2 - BashLandonView Answer on Stackoverflow
Solution 3 - BashThomas KammeyerView Answer on Stackoverflow
Solution 4 - BasherichuiView Answer on Stackoverflow
Solution 5 - BashJohn MeagherView Answer on Stackoverflow
Solution 6 - BashMark NoldView Answer on Stackoverflow
Solution 7 - BashtechnosaurusView Answer on Stackoverflow