Why isn't tilde expansion performed on the input to read?

Multi tool use
up vote
4
down vote
favorite
Why has tilde expansion not occurred in the output of this script?
#!/bin/bash
read -p "Enter filename: " fname
if [[ -d $fname ]]
then
echo "$fname is a directory"
else
echo "$fname is not a directory"
fi
Output:
$ bash -x test_cd.sh
+ read -p 'Enter filename: ' fname
Enter filename: ~/Music
+ [[ -d ~/Music ]]
+ echo ' ~/Music is not a directory'
~/Music is not a directory
command-line bash scripts
New contributor
jestadi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
up vote
4
down vote
favorite
Why has tilde expansion not occurred in the output of this script?
#!/bin/bash
read -p "Enter filename: " fname
if [[ -d $fname ]]
then
echo "$fname is a directory"
else
echo "$fname is not a directory"
fi
Output:
$ bash -x test_cd.sh
+ read -p 'Enter filename: ' fname
Enter filename: ~/Music
+ [[ -d ~/Music ]]
+ echo ' ~/Music is not a directory'
~/Music is not a directory
command-line bash scripts
New contributor
jestadi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
up vote
4
down vote
favorite
up vote
4
down vote
favorite
Why has tilde expansion not occurred in the output of this script?
#!/bin/bash
read -p "Enter filename: " fname
if [[ -d $fname ]]
then
echo "$fname is a directory"
else
echo "$fname is not a directory"
fi
Output:
$ bash -x test_cd.sh
+ read -p 'Enter filename: ' fname
Enter filename: ~/Music
+ [[ -d ~/Music ]]
+ echo ' ~/Music is not a directory'
~/Music is not a directory
command-line bash scripts
New contributor
jestadi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
Why has tilde expansion not occurred in the output of this script?
#!/bin/bash
read -p "Enter filename: " fname
if [[ -d $fname ]]
then
echo "$fname is a directory"
else
echo "$fname is not a directory"
fi
Output:
$ bash -x test_cd.sh
+ read -p 'Enter filename: ' fname
Enter filename: ~/Music
+ [[ -d ~/Music ]]
+ echo ' ~/Music is not a directory'
~/Music is not a directory
command-line bash scripts
command-line bash scripts
New contributor
jestadi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
jestadi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
edited yesterday


Zanna
48.9k13123234
48.9k13123234
New contributor
jestadi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
asked yesterday


jestadi
234
234
New contributor
jestadi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
jestadi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
jestadi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
5
down vote
accepted
That’s simply because read
doesn’t perform tilde expansion before saving the string, neither is it performed on a variable content later. You can use $HOME
instead and enter
$HOME/Music
or let the script test for ~/
and replace it (taken from this answer):
case "$fname" in "~/"*)
fname="${HOME}/${x#"~/"}"
esac
You can also use bash
Parameter Expansion to replace ~/
with $HOME
at the beginning of the string:
if [[ -d ${fname/#~//$HOME/} ]]
This variable is expanded before the substitution is performed.
1
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
yesterday
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
yesterday
@Zanna Tilde expansion is not mentioned in theread
description in both POSIX and bash manuals. What's not in the manual is just as important as what's in it :)
– Sergiy Kolodyazhnyy
yesterday
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
5
down vote
accepted
That’s simply because read
doesn’t perform tilde expansion before saving the string, neither is it performed on a variable content later. You can use $HOME
instead and enter
$HOME/Music
or let the script test for ~/
and replace it (taken from this answer):
case "$fname" in "~/"*)
fname="${HOME}/${x#"~/"}"
esac
You can also use bash
Parameter Expansion to replace ~/
with $HOME
at the beginning of the string:
if [[ -d ${fname/#~//$HOME/} ]]
This variable is expanded before the substitution is performed.
1
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
yesterday
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
yesterday
@Zanna Tilde expansion is not mentioned in theread
description in both POSIX and bash manuals. What's not in the manual is just as important as what's in it :)
– Sergiy Kolodyazhnyy
yesterday
add a comment |
up vote
5
down vote
accepted
That’s simply because read
doesn’t perform tilde expansion before saving the string, neither is it performed on a variable content later. You can use $HOME
instead and enter
$HOME/Music
or let the script test for ~/
and replace it (taken from this answer):
case "$fname" in "~/"*)
fname="${HOME}/${x#"~/"}"
esac
You can also use bash
Parameter Expansion to replace ~/
with $HOME
at the beginning of the string:
if [[ -d ${fname/#~//$HOME/} ]]
This variable is expanded before the substitution is performed.
1
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
yesterday
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
yesterday
@Zanna Tilde expansion is not mentioned in theread
description in both POSIX and bash manuals. What's not in the manual is just as important as what's in it :)
– Sergiy Kolodyazhnyy
yesterday
add a comment |
up vote
5
down vote
accepted
up vote
5
down vote
accepted
That’s simply because read
doesn’t perform tilde expansion before saving the string, neither is it performed on a variable content later. You can use $HOME
instead and enter
$HOME/Music
or let the script test for ~/
and replace it (taken from this answer):
case "$fname" in "~/"*)
fname="${HOME}/${x#"~/"}"
esac
You can also use bash
Parameter Expansion to replace ~/
with $HOME
at the beginning of the string:
if [[ -d ${fname/#~//$HOME/} ]]
This variable is expanded before the substitution is performed.
That’s simply because read
doesn’t perform tilde expansion before saving the string, neither is it performed on a variable content later. You can use $HOME
instead and enter
$HOME/Music
or let the script test for ~/
and replace it (taken from this answer):
case "$fname" in "~/"*)
fname="${HOME}/${x#"~/"}"
esac
You can also use bash
Parameter Expansion to replace ~/
with $HOME
at the beginning of the string:
if [[ -d ${fname/#~//$HOME/} ]]
This variable is expanded before the substitution is performed.
edited yesterday
answered yesterday


dessert
21k55896
21k55896
1
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
yesterday
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
yesterday
@Zanna Tilde expansion is not mentioned in theread
description in both POSIX and bash manuals. What's not in the manual is just as important as what's in it :)
– Sergiy Kolodyazhnyy
yesterday
add a comment |
1
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
yesterday
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
yesterday
@Zanna Tilde expansion is not mentioned in theread
description in both POSIX and bash manuals. What's not in the manual is just as important as what's in it :)
– Sergiy Kolodyazhnyy
yesterday
1
1
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
yesterday
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
yesterday
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input to
read
?– Zanna
yesterday
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input to
read
?– Zanna
yesterday
@Zanna Tilde expansion is not mentioned in the
read
description in both POSIX and bash manuals. What's not in the manual is just as important as what's in it :)– Sergiy Kolodyazhnyy
yesterday
@Zanna Tilde expansion is not mentioned in the
read
description in both POSIX and bash manuals. What's not in the manual is just as important as what's in it :)– Sergiy Kolodyazhnyy
yesterday
add a comment |
jestadi is a new contributor. Be nice, and check out our Code of Conduct.
jestadi is a new contributor. Be nice, and check out our Code of Conduct.
jestadi is a new contributor. Be nice, and check out our Code of Conduct.
jestadi is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1093906%2fwhy-isnt-tilde-expansion-performed-on-the-input-to-read%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
5W3Sq,4Q0eq6R,O,r8sBxceIm4LiIzfZzNVV qBWW,f,oZ1j3tKuG fgz33,P 3i,SPQ QRfqB,y48e okqL0ag