2010-12-10 26 views
20

Trong bash tôi có thể tạo ra một kịch bản với một ở đây-doc như vậy theo trang web này: http://tldp.org/LDP/abs/html/abs-guide.html#GENERATESCRIPTTạo kịch bản trong bash và lưu nó vào vị trí đòi hỏi sudo

(
cat <<'EOF' 
#!/bin/bash 
#? [ ]/\ = + < > : ; " , * | 
#/ ? < > \ : * | ” 
#Filename="z:"${$winFn//\//\\} 
echo "This is a generated shell script." 
App='eval wine "C:\Program Files\foxit\Foxit Reader.exe" "'$winFn'"' 
$App 
EOF 
) > $OUTFILE 

Nếu tôi $OUTFILE là một thư mục đòi hỏi sudo đặc quyền nơi tôi đặt lệnh sudo hoặc tôi có thể làm gì khác để làm cho nó hoạt động?

+0

Tôi cho rằng một giải pháp là để tạo ra các tập tin vào một vị trí tạm thời và sau đó di chuyển nó với sudo đến vị trí thích hợp. Đó có phải là cách thanh lịch nhất để làm điều đó không? –

Trả lời

14

Bạn không thể chỉ đặt sudo trước mèo vì> $ OUTFILE cố mở $ OUTFILE trong quy trình trình bao hiện tại, không chạy dưới dạng gốc. Bạn cần mở tệp đó để xảy ra trong một tiến trình con sudo-ed.

Dưới đây là một cách để làm điều đó:

sudo bash -c "cat >$OUTFILE" <<'EOF' 
#!/bin/bash 
#? [ ]/\ = + < > : ; " , * | 
#/ ? < > \ : * | ” 
#Filename="z:"${$winFn//\//\\} 
echo "This is a generated shell script." 
App='eval wine "C:\Program Files\foxit\Foxit Reader.exe" "'$winFn'"' 
$App 
EOF 
+0

Điều này làm việc cho ví dụ làm việc tối thiểu của tôi nhưng không cho kịch bản thực tế của tôi. Tôi đã làm cho ví dụ làm việc tối thiểu của tôi đủ phức tạp hơn, bạn có thể giúp tôi với kịch bản mới không? –

+0

@D W: Tôi đã không bỏ phiếu từ này của bạn, có thể là nguồn gốc của sự cố của bạn. Xin lỗi vì điều đó. Hãy thử trích dẫn lại nó, như được hiển thị trong câu trả lời cập nhật của tôi. –

+0

@D W: bạn đã thử câu trả lời cập nhật chưa? Nó hoạt động với mã mới hơn trong câu hỏi của bạn. Tôi chỉ cần đi và cập nhật nó một lần nữa để thực sự bao gồm mã từ câu hỏi của bạn. –

44

Đây là cách tôi sẽ làm điều đó:

sudo tee "$OUTFILE" > /dev/null <<'EOF' 
foo 
bar 
EOF 
+0

sử dụng thông minh tee, thx – javadba

+0

Làm thế nào để bạn sử dụng phương pháp này để nối thêm vào một tệp hiện có? – MountainX

+5

@MountainX: 'tee -a' nối vào tệp. –

Các vấn đề liên quan