2009-05-03 29 views
37

Một điều tôi định làm là viết các kịch bản Perl đơn giản (đau đớn), và tôi muốn có thể chạy chúng mà không cần gọi Perl một cách rõ ràng từ thiết bị đầu cuối. Tôi đánh giá cao rằng, để làm điều này, tôi cần phải cấp cho họ quyền thực thi. Làm điều này với chmod là đủ dễ dàng, nhưng nó cũng có vẻ giống như một bước bổ sung hơi mất thời gian. Điều tôi muốn là một trong hai điều sau:Tạo các tệp thi hành trong Linux

Thứ nhất, có cách nào để đặt cờ thực thi khi lưu tệp không? Hiện tại tôi đang thử nghiệm với gedit và geany, nhưng sẽ sẵn sàng chuyển sang một trình soạn thảo nổi bật tương tự- (hoặc tốt hơn) nếu nó có khả năng này.

Nếu không, có cách nào tuyên bố rằng tất cả các tệp được tạo trong một thư mục cụ thể phải có quyền thực thi không?

umask của tôi được đặt thành 022, điều này sẽ ổn, theo tôi hiểu, nhưng có vẻ như tệp được tạo dưới dạng tệp văn bản (với 666 quyền mặc định) thay vì tệp thực thi (với quyền mặc định 777) .

Có lẽ tôi chỉ là lười biếng, nhưng tôi hình phải có một cách thuận tiện hơn so với chmodding mỗi một kịch bản duy nhất tạo ra.

+0

Bạn phải in đầu ra của mỗi tệp. Bạn phải nhập đúng thư viện của mỗi tệp. Điều này có vẻ giống như một bước khác trong quá trình lập trình và một bước nguy hiểm để vượt qua. – JFA

Trả lời

2

Nó thực sự không phải là một thỏa thuận lớn. Bạn chỉ có thể tạo tập lệnh bằng một lệnh duy nhất:

chmod a+x *.pl 

Và chạy tập lệnh sau khi tạo tệp perl. Ngoài ra, bạn có thể mở một tập tin với một lệnh như thế này:

touch filename.pl && chmod a+x filename.pl && vi filename.pl # choose your favorite editor 
+0

Tôi đã tìm kiếm một cách để làm tất cả mọi thứ vào GUI, nhưng có lẽ điều này là không thể. Đó có phải là điều bảo mật không? –

+0

có, đó là một điều bảo mật. Nó có thể là một vấn đề lớn nếu shell bắt đầu tạo mọi thứ có thể thực thi theo mặc định. – JimB

+0

Bạn có thể tạo một chương trình đơn giản thực hiện điều này cho bạn. Nhưng thành thật mà nói, bạn sẽ cố gắng làm điều gì đó không ai khác, những người lập trình trong môi trường UNIX thực sự. – BobbyShaftoe

80

Make tập tin thực thi:

chmod + x nộp

Tìm vị trí của perl:

mà perl

này sẽ trả về một cái gì đó giống như

/bin/perl đôi khi/usr/local/bin

Sau đó, trong dòng đầu tiên của kịch bản của bạn thêm:

# "con đường "/ perl với đường dẫn từ trên ví dụ

#!/Bin/perl

Sau đó, bạn có thể chạy file

./file

Có thể có một số vấn đề với PATH, vì vậy bạn có thể muốn để thay đổi điều đó ...

+0

Cảm ơn, nhưng đó không phải là vấn đề của tôi. Tôi đã có thói quen bắt đầu tập lệnh của mình với #!/Usr/bin/perl. Tôi có thể chạy kịch bản tốt một khi tôi đã cho họ quyền thực thi; Tôi chỉ đang tìm cách làm đơn giản hơn. –

+11

Tôi có thể đề xuất '#!/Usr/bin/env perl' thay thế? Chương trình 'env' về cơ bản tìm ra đối số được đưa ra (trong trường hợp này là" perl ") trên PATH và chạy nó. Nó rất hữu ích khi bạn đang gửi kịch bản cho người khác - ví dụ, tôi sử dụng một máy Mac, và Perl nằm trong/opt/local/bin. –

3

Những gì bạn mô tả là cách chính xác để xử lý việc này.

Bạn đã nói rằng bạn muốn ở lại trong GUI. Bạn thường có thể thiết lập bit thực thi thông qua menu thuộc tính tệp. Bạn cũng có thể tìm hiểu cách tạo hành động tùy chỉnh cho trình đơn ngữ cảnh để thực hiện việc này cho bạn nếu bạn nghiêng. Điều này phụ thuộc vào môi trường máy tính để bàn của bạn tất nhiên.

Nếu bạn sử dụng trình chỉnh sửa nâng cao hơn, bạn có thể viết hành động xảy ra khi tệp được lưu. Ví dụ (tôi chỉ thực sự quen thuộc với vim), bạn có thể thêm nó vào .vimrc của bạn để tạo bất kỳ tệp mới nào bắt đầu bằng "#!/*/bin/*" thực thi.

au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif 
+0

Sử dụng mẹo này, tôi gặp phải vấn đề được đề cập ở đây: https://bbs.archlinux.org/viewtopic.php?id=126304 Vì vậy, bây giờ tôi đang sử dụng phiên bản được sửa đổi một chút 'autocmd BufWritePost * if getline (1) = ~ "^ #!/bin /" | im lặng thực hiện "! chmod a + x " | endif' – Gautam

0

Tôi nghĩ vấn đề bạn đang chạy vào đó là, mặc dù bạn có thể thiết lập giá trị umask của riêng bạn trong hệ thống, điều này không cho phép bạn kiểm soát một cách rõ ràng các điều khoản mặc định trên một tập tin mới bằng gedit (hoặc bất kỳ trình soạn thảo nào bạn sử dụng).

Tôi tin rằng chi tiết này được mã hóa cứng vào gedit và hầu hết các trình chỉnh sửa khác. Tùy chọn của bạn để thay đổi nó là (a) hacking lên mod của riêng bạn của gedit hoặc (b) tìm kiếm một trình soạn thảo văn bản cho phép bạn thiết lập một sở thích cho quyền mặc định trên các tập tin mới. (Xin lỗi, tôi không biết gì cả.)

Trong điều này, nó thực sự không phải là quá xấu để phải chmod các tập tin của bạn, phải không?

5

Không cần phải hack trình chỉnh sửa của bạn hoặc chuyển đổi trình chỉnh sửa.

Thay vào đó, chúng tôi có thể đưa ra một tập lệnh để xem các thư mục phát triển của bạn và các tệp chmod khi chúng được tạo. Đây là những gì tôi đã thực hiện trong kịch bản bash đính kèm. Bạn có thể muốn đọc qua các bình luận và chỉnh sửa phần 'config' phù hợp với nhu cầu của bạn, sau đó tôi khuyên bạn nên đặt nó vào thư mục $ HOME/bin/của bạn và thêm nó vào tập tin $ HOME/.login hoặc tương tự của bạn. Hoặc bạn chỉ có thể chạy nó từ thiết bị đầu cuối.

Kịch bản này đòi hỏi inotifywait, mà đi kèm trong inotify-công cụ gói trên Ubuntu,

sudo apt-get install inotify-tools 

Gợi ý/chỉnh sửa/cải tiến được hoan nghênh.

#!/usr/bin/env bash 

# --- usage --- # 
# Depends: 'inotifywait' available in inotify-tools on Ubuntu 
# 
# Edit the 'config' section below to reflect your working directory, WORK_DIR, 
# and your watched directories, WATCH_DIR. Each directory in WATCH_DIR will 
# be logged by inotify and this script will 'chmod +x' any new files created 
# therein. If SUBDIRS is 'TRUE' this script will watch WATCH_DIRS recursively. 
# I recommend adding this script to your $HOME/.login or similar to have it 
# run whenever you log into a shell, eg 'echo "watchdirs.sh &" >> ~/.login'. 
# This script will only allow one instance of itself to run at a time. 

# --- config --- # 

WORK_DIR="$HOME/path/to/devel" # top working directory (for cleanliness?) 
WATCH_DIRS=" \ 
    $WORK_DIR/dirA \ 
    $WORK_DIR/dirC \ 
    "       # list of directories to watch 
SUBDIRS="TRUE"     # watch subdirectories too 
NOTIFY_ARGS="-e create -q"  # watch for create events, non-verbose 


# --- script starts here --- # 
# probably don't need to edit beyond this point 

# kill all previous instances of myself 
SCRIPT="bash.*`basename $0`" 
MATCHES=`ps ax | egrep $SCRIPT | grep -v grep | awk '{print $1}' | grep -v $$` 
kill $MATCHES >& /dev/null 

# set recursive notifications (for subdirectories) 
if [ "$SUBDIRS" = "TRUE" ] ; then 
    RECURSE="-r" 
else 
    RECURSE="" 
fi 

while true ; do 
    # grab an event 
    EVENT=`inotifywait $RECURSE $NOTIFY_ARGS $WATCH_DIRS` 

    # parse the event into DIR, TAGS, FILE 
    OLDIFS=$IFS ; IFS=" " ; set -- $EVENT 
    E_DIR=$1 
    E_TAGS=$2 
    E_FILE=$3 
    IFS=$OLDIFS 

    # skip if it's not a file event or already executable (unlikely) 
    if [ ! -f "$E_DIR$E_FILE" ] || [ -x "$E_DIR$E_FILE" ] ; then 
     continue 
    fi 

    # set file executable 
    chmod +x $E_DIR$E_FILE 
done 
+0

Nó sẽ không đơn giản hơn để đặt umask trên thư mục? –

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