2010-03-10 45 views
11

Tôi đang viết một kịch bản lệnh shell và tôi cần phải tạo một tệp tạm thời với một phần mở rộng nhất định.Làm cách nào để tạo tệp tạm thời có phần mở rộng cụ thể trong bash?

Tôi đã thử

tempname=`basename $0` 
TMPPS=`mktemp /tmp/${tempname}.XXXXXX.ps` || exit 1 

tempname=`basename $0` 
TMPPS=`mktemp -t ${tempname}` || exit 1 

không phải làm việc, là người đầu tiên tạo ra một tên tập tin với một chữ "XXXXXX" và lần thứ hai không đưa ra một lựa chọn cho một sự mở rộng.

Tôi cần tiện ích để bản xem trước sẽ không từ chối mở tệp.

Edit: tôi đã kết thúc đi với một sự kết hợp của pid và mktemp trong những gì tôi hy vọng là an toàn:

tempname=`basename $0` 
TMPTMP=`mktemp -t ${tempname}` || exit 1 
TMPPS="$TMPTMP.$$.ps" 
mv $TMPTMP $TMPPS || exit 1 

Nó là dễ bị tấn công từ chối dịch vụ, nhưng tôi không nghĩ rằng bất cứ điều gì nghiêm trọng hơn.

Trả lời

9

các phiên bản gần đây của mktemp phục vụ --suffix:

--suffix=SUFF 
      append SUFF to TEMPLATE. SUFF must not contain slash. This option is implied if TEMPLATE does not end in X. 

$ mktemp /tmp/banana.XXXXXXXXXXXXXXXXXXXXXXX.mp3 
/tmp/banana.gZHvMJfDHc2CTilINNuq2P0.mp3 

Tôi tin rằng điều này đòi hỏi coreutils> = 8 hoặc lâu hơn.

Nếu bạn tạo tệp tạm thời (phiên bản mktemp cũ hơn) mà không có hậu tố và bạn đổi tên để nối thêm, điều ít nhất bạn có thể làm là kiểm tra xem tệp đã tồn tại chưa. Nó không bảo vệ bạn khỏi điều kiện chủng tộc, nhưng nó bảo vệ bạn nếu có một tập tin như vậy đã tồn tại trong một thời gian.

+1

FYI: * BSD * mktemp trong Mac OSX không có tùy chọn này, ít nhất không phải trong 10.11. – Jokester

+1

@ Tên của Jokester không phải là lời nói dối. Và do đó, tôi có nghĩa là OSX/macOS không * không * có '--suffix', vẫn là 10,12. –

+0

@CharlieGorichanaz Tệ của tôi. Đoán tôi đã cố gắng để viết "không có tùy chọn này", bởi vì tôi vẫn có thể nhớ gỡ lỗi kịch bản của tôi trong OSX cho sự khác biệt này: ( – Jokester

3

Làm thế nào về vấn đề này một:

echo $(mktemp $TMPDIR/$(uuidgen).txt) 
1

MacOS Sierra 10.12 không có --suffix lựa chọn, vì vậy tôi đề nghị cách giải quyết:

tempname=`basename $0` 
    TMPPS_PREFIX=$(mktemp "${TMPDIR:-/tmp/}${tempname}.XXXXXX") 
    TMPPS=$(mktemp "${TMPPS_PREFIX}.ps") 
    rm ${TMPPS_PREFIX} 
    echo "Your temp file: ${TMPPS}" 
Các vấn đề liên quan