Why isn't tilde expansion performed on the input to read?
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
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
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
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
New contributor
edited yesterday
Zanna
48.9k13123234
48.9k13123234
New contributor
asked yesterday
jestadi
234
234
New contributor
New contributor
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