我想声明一个存储视频文件所有扩展名的环境变量,以便在使用 shell 时可以使用它。
我尝试了几件事,但从来没有让它工作:如果在我的 .bash_profile 中我放了:
export VIDEOS={mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}
Run Code Online (Sandbox Code Playgroud)
它只需要最后一个元素:
[nbarraille@nbarraille ~]echo $VIDEOS
mpeg
Run Code Online (Sandbox Code Playgroud)
如果在我的 .bash_profile 中我放了:
export VIDEOS="{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}"
Run Code Online (Sandbox Code Playgroud)
或者
export VIDEOS='{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}'
Run Code Online (Sandbox Code Playgroud)
然后,当我显示它时它看起来不错,但是当我在 ls 中使用它时它不起作用,例如:
[nbarraille@nbarraille ~] echo $VIDEOS
{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}
[nbarraille@nbarraille ~] ll *.$VIDEOS
ls: cannot access *.{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}: No such file or directory
Run Code Online (Sandbox Code Playgroud)
当我在不使用变量的情况下运行完全相同的命令时,它可以工作:
[nbarraille@nbarraille ~] echo *.{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}
example.avi
example2.mpg
Run Code Online (Sandbox Code Playgroud)
此外,当我重新启动时,看起来我的 .bash_profile 没有加载,并且 $VIDEOS 变量为空。我必须做一个source ~/.bash_profile
才能让它工作(每次我打开一个新终端时我都必须重做。
任何的想法?
谢谢!
您的命令正在扩展为:
export VIDEOS=mp4 VIDEOS=wmv VIDEOS=avi VIDEOS=flv VIDEOS=mkv VIDEOS=m4u VIDEOS=mpg VIDEOS=mpeg
Run Code Online (Sandbox Code Playgroud)
运行它以查看发生了什么:
echo export VIDEOS={mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}
Run Code Online (Sandbox Code Playgroud)
(这叫做大括号扩展)
第二个问题是bash
在参数扩展之前而不是在参数扩展之后进行大括号扩展,因此任何看起来像您的解决方案的东西都会变得混乱。
你将不得不做这样的事情:
eval echo \*.$VIDEOS
Run Code Online (Sandbox Code Playgroud)
每次打字都会很烦人。
这样的事情怎么样:
videos() {
find . -mindepth 1 -maxdepth 1 -type f \
\( -name "*.mp4" -o -name "*.wmv" -o -name "*.avi" -o \
-name "*.flv" -o -name "*.mkv" -o -name "*.m4u" -o \
-name "*.mpg" -o -name "*.mpeg" \)
}
Run Code Online (Sandbox Code Playgroud)
然后而不是做:
ls *.$VIDEOS
Run Code Online (Sandbox Code Playgroud)
只需这样做:
videos
Run Code Online (Sandbox Code Playgroud)
或者如果您需要将其传递给命令:
ls $(videos)
Run Code Online (Sandbox Code Playgroud)
这部分工作:
echo *.{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}
Run Code Online (Sandbox Code Playgroud)
可能是.bash_profile
不工作的线索。例如,这可能意味着您正在使用zsh
.
请告诉我们这是做什么的:
echo $0
Run Code Online (Sandbox Code Playgroud)
所以我们可以找出你必须把它放在哪个文件中。