我想设置一个makefile,该文件通过Bash自动完成功能读取用户输入,并在此基础上创建一个目录,在该目录中可以复制一些文件。基本上像
$ make initializeProject
Enter destination: Dir<ectory>/Sub<directory>/ProjectDirectory
mkdir: created directory 'Directory/Subdirectory/ProjectDirectory'
'Templates/TemplateFile' -> 'Directory/Subdirectory/ProjectDirectory/TemplateFile'
[< X >
代表自动完成的零件。
到目前为止,我的makefile不会自动完成,看起来像这样:
initProjectLaTeX:
@read -p "Enter destination: " destination; \
mkdir -pv $$destination; \
cp -iv ~/.templates/latex/* $$destination
我尝试过this选项,但是会产生错误/bin/sh: 1: read: Illegal option -e
。如何在此处访问Bash自动补全功能?
make
使用/bin/sh
作为默认外壳,在许多系统上,它与bash
不同(例如,在Debian上为dash
)。我怀疑dash
的-e
选项是read
扩展名,这就是为什么出现错误的原因:
bash
将/bin/sh: 1: read: Illegal option -e
设置为/bin/bash
中的SHELL
应该起作用:
Makefile
Makefile
示例
SHELL := /bin/bash
initProjectLaTeX:
@read -e -p "Enter destination: " destination; \
mkdir -pv $$destination; \
cp -iv ~/tmp/*c $$destination
完成
$ make initProjectLaTeX
Enter destination: foo/bar/baz
mkdir: created directory 'foo'
mkdir: created directory 'foo/bar'
mkdir: created directory 'foo/bar/baz'
'/home/marco/tmp/foo.c' -> 'foo/bar/baz/foo.c'
$ tree foo
foo
└── bar
└── baz
└── foo.c
2 directories, 1 file
$
不是让$ make initProjectLaTeX
Enter destination: foo
foo/ foo.c
Enter destination: foo
foo/ foo.c
Enter destination: foo
与用户互动,而是将所需的目的地传递给make
。
以修改后的配方开始:
make
然后运行
initProjectLaTeX:
mkdir -pn $(DESTINATION)
cp -iv ~/.templates/latex/* $(DESTINATION)
([make initProjectLaTeX DESTINATION=Dir<ectory>/Sub<directory>/ProjectDirectory
允许完成分配的值。)