下面的代码段旨在收听并从目录中选择一些歌曲:
exec 3<&1
find /some/directory -name '*.mp3' -print0 | xargs -0 bash -c '
for i; do
mplayer -ss 10 "$i" 1<&3
read -p "Select? (y/n)" -n 1 choice 1<&3
if [ "$choice" = "y" -o "$choice" = "Y" ]; then
echo "$i" > /tmp/selected_songs.txt
fi
done
'
exec 3<&-
目的是让mplayer
和shell read
接受来自键盘的输入,但是没有成功!为此,我认为FD 3将指向find
和xargs
进程的键盘输入。这又被传递给xargs
执行的shell,其中执行了mplayer
和shell read
;但它没有!
这里出了什么问题?
答案 0 :(得分:2)
首先,我认为你正在努力实现这一目标。如果你有bash 4,请使用globstar。
shopt -s globstar
for i in /some/directory/**/*.mp3; do
mplayer -ss 10 "$i"
read -p "Select? (y/n)" -n 1 choice
case "$choice" in
[yY]) echo "$i" >> /tmp/selected_songs.txt;;
esac
done
即使您没有,也可以使用find … -exec bash -c 'yourscript' _ {} +
而不是xargs
来执行此操作。
(我还将您的>
更改为>>
因为我认为您不希望在每次传递时截断文件。)
至于理解这个问题,这里有各种复杂的问题,但我会指出一些重要的事情:
exec 3<&1
将1重复为3并打开读取。xargs
具有相关的-o
选项。请检查您的联机帮助页。)答案 1 :(得分:0)
如果你想要一个带有bash的子shell,那么你可以这样做:
find /media/jeenu/USB/ -type f -print0 | xargs -0 bash <<EOF
#This is a bash subshell
#put your code here
EOF