Why isn't tilde expansion performed on the input to read?
up vote
6
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
add a comment |
up vote
6
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
add a comment |
up vote
6
down vote
favorite
up vote
6
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
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
edited Nov 18 at 14:12
Zanna
49.1k13123234
49.1k13123234
asked Nov 18 at 7:11
jestadi
335
335
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
7
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
Nov 18 at 8:08
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
Nov 18 at 14:15
@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
Nov 18 at 19:34
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
7
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
Nov 18 at 8:08
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
Nov 18 at 14:15
@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
Nov 18 at 19:34
add a comment |
up vote
7
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
Nov 18 at 8:08
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
Nov 18 at 14:15
@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
Nov 18 at 19:34
add a comment |
up vote
7
down vote
accepted
up vote
7
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 Nov 18 at 16:50
answered Nov 18 at 7:48
dessert
21.3k55896
21.3k55896
1
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
Nov 18 at 8:08
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
Nov 18 at 14:15
@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
Nov 18 at 19:34
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
Nov 18 at 8:08
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input toread
?
– Zanna
Nov 18 at 14:15
@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
Nov 18 at 19:34
1
1
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
Nov 18 at 8:08
And also because it's not required nowhere in POSIX standard, and as consequence nowhere in bash manual. +1
– Sergiy Kolodyazhnyy
Nov 18 at 8:08
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input to
read
?– Zanna
Nov 18 at 14:15
@SergiyKolodyazhnyy what do you mean? What is not mentioned? Tilde expansion is mentioned. Do you mean tilde expansion in the input to
read
?– Zanna
Nov 18 at 14:15
@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
Nov 18 at 19:34
@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
Nov 18 at 19:34
add a comment |
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