Tôi đang tạo tập lệnh hoàn thành bash cho công cụ chia sẻ tệp tải lên ngữ nghĩa với curl.Cách ngăn hoàn thành bash thay thế ký tự khi tab hoàn thành
Với curl, bạn có thể làm:
curl -F var = @ tập tin
để tải lên một tập tin.
Ứng dụng của tôi có ngữ nghĩa tương tự và tôi muốn có thể hiển thị các tệp có thể sau khi nhấn '@'. Thật không may, điều này được chứng minh khó khăn:
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
if [[ "$cur" == @* && "$prev" == '=' ]]; then
COMPREPLY=($(compgen -f ${cur:1}))
return 0
fi
Vì vậy, nếu một lệnh (cho đến nay) kết thúc với:
[email protected]
tập tin trong thư mục hiện sẽ hiển thị.
[email protected]/usr/
/usr/bin /usr/games
Vấn đề là nếu tôi thực sự nhấn tab để hoàn thành, dấu '@' biến mất!
var=/usr/bin
Vì vậy, có vẻ như bash sẽ thay thế toàn bộ từ hiện tại bằng COMPREPLY theo thẻ.
Cách duy nhất để tránh điều này đã được để làm điều này:
COMPREPLY=($(compgen -f ${cur:1}))
for ((i=0; i<${#COMPREPLY[@]}; i++));
do
COMPREPLY[$i]='@'${COMPREPLY[$i]}
done
Nhưng bây giờ hoàn tab trông lạ để nói rằng ít nhất:
@/usr/bin @/usr/games
Liệu có cách nào để hiển thị một tập tin bình thường hoàn thành tab (không có tiền tố '@') nhưng giữ lại '@' khi nhấn tab?
tạo ảnh vui nhộn câu hỏi! Tôi đã học được rất nhiều câu trả lời này. – sanmiguel