Làm thế nào để tôi thực hiện toàn bộ thư mục thực thi?


14

Tôi có toàn bộ thư mục dành riêng cho các kịch bản python.

Tôi mệt mỏi khi làm chmod trên mỗi kịch bản python mới mà tôi viết.

Có cách nào để làm cho mọi tệp trong thư mục của tôi có thể thực thi được nếu đó là tập lệnh python không?

Sẽ thật tuyệt nếu có một tập lệnh kiểm tra bất cứ khi nào tập lệnh .py mới được tạo và nếu có tập lệnh .py mới làm cho tập lệnh có thể thực thi ngay tại chỗ.

  • Tôi sử dụng Vim.

Bạn sử dụng gì để viết các kịch bản này? Nó có thể được cấu hình vimhoặc emacsđể làm điều đó cho bạn.
muru

Tôi dùng vim. Và đó sẽ là hoàn hảo.
Dominici

Có thư mục con trong thư mục?
Jacob Vlijm

Không có thư mục con chỉ là kịch bản của tôi.
Dominici

Câu trả lời:


10

Một lựa chọn tốt khác là Incron . Nó hoạt động trên inotify với các điều kiện cụ thể cho một vị trí nhất định.

Vì vậy, tôi có thể nói xem thư mục này, khi bạn thấy một tệp được tạo, hãy chạy một lệnh.

Cũng giống như một mẫu incrontab ...

/path/to/scripts IN_CREATE chmod +x $@$#  # <--- this arcane bit is path ($@) + file ($#)

Người ta có thể sử dụng tương tự đường dẫn / tệp làm đối số cho tập lệnh bash để cho phép nó lọc theo .pyphần mở rộng nếu cần.


Không chắc mọi người có quay lại trả lời các câu hỏi để cảm ơn không ... nhưng dù sao đi nữa. Tôi mới đến đây, ai quan tâm chứ. Cảm ơn bạn rất nhiều Tôi đang sử dụng incron cho khá nhiều thứ tôi đang làm.
Dominici

Không phải lo lắng, glade nó đã được hữu ích. :) Dự án là loại tối nghĩa, vì vậy tôi thích chia sẻ nó với mọi người. Tôi đã tận dụng nó để tự động hóa và sắp xếp mọi thứ.
DivinusVox

5
chmod +x /path/to/python/scripts/dir/*.py 

Sẽ thực thi tất cả .pycác tệp hiện tại trong thư mục / path / to / python / scripts / dir .

Tôi không biết về một công cụ tự động như bạn mô tả. Có thể có một macro trong trình soạn thảo của bạn có thể làm điều này, nhưng không phải với trình soạn thảo tôi sử dụng. ;-)


4
cảm ơn vì con trỏ OP đặc biệt nói kịch bản python, vì vậy đó là lý do tại sao tôi bao gồm *.py. Tôi cũng cho rằng các tập lệnh OP được sở hữu bởi ID người dùng tiêu chuẩn của anh ấy, vì vậy tôi không thấy sự cần thiết sudo. Chúc mọi người may mắn.
shellter

1

Bước đầu tiên, bạn có thể thử điều này trong ~/.vimrc:

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Điều này chạy chmod +xtrên tên tệp cho tất cả .pycác tệp khi bạn viết cho chúng. Nhìn vào danh sách các sự kiện ( :h events), tôi không thể tìm thấy một sự kiện trong đó một tệp mới được tạo, vì vậy tôi phải giải quyết để chạy mỗi khi nó được ghi vào.
  • Lần đầu tiên chmodđược áp dụng, tập tin sẽ được thay đổi và vimsẽ cảnh báo bạn về điều đó:

    "test.py" [New] 0L, 0C written
    W16: Warning: Mode of file "test.py" has changed since editing started
    See ":help W16" for more info.
    [O]K, (L)oad File:

    Tôi đã thử một vài thủ thuật để thực hiện nó autoreadchỉ cho sự thay đổi này, nhưng không có may mắn. Vì vậy, bạn sẽ phải nhấn Enterhai lần.


1

Khi được khởi tạo, tập lệnh bên dưới sẽ tự động thay đổi quyền của tất cả các tệp thuộc loại đã cho (phần mở rộng) trong một thư mục (một lần). Sau đó, tập lệnh sẽ kiểm tra thư mục cứ sau 5 giây cho các tệp mới được thêm và thay đổi quyền nếu tệp thuộc loại đã cho (trong trường hợp này là .pytệp)

Nó có một vài tùy chọn: trong trường hợp này, nó làm cho các tệp mới được thêm vào có thể thực thi được, nhưng các hành động khác cũng có thể, như được định nghĩa trong dòng : command = "chmod +x". Ngoài ra, bạn có thể xác định (thay đổi) về loại tệp (phần mở rộng ngôn ngữ) mà hành động nên được thực hiện.

Cách sử dụng

Sao chép tập lệnh dưới đây vào một tập tin trống. Lưu nó dưới dạng change_permission.pyvà chạy nó trong nền bằng lệnh:

python3 <script> <folder_to_watch>

Kịch bản

#!/usr/bin/env python3

import subprocess
import time
import sys

directory = sys.argv[1]
command = "chmod +x"; check_interval = 5; extensions = (".py")

def current_files():
    read = subprocess.check_output(["ls", directory]).decode("utf-8").strip()
    return [item for item in read.split("\n") if item[item.rfind("."):] in extensions]

initial_files = current_files()
for file in initial_files:
    subprocess.call(["/bin/bash", "-c", command+" "+directory+"/"+file])

while True:
    update = current_files()
    for file in update:
        if not file in initial_files:
            subprocess.call(["/bin/bash", "-c", command+" "+directory+"/"+file])  
    initial_files = update
    time.sleep(check_interval)

* Lưu ý: nếu bạn cần đặc quyền sudo, chỉ cần chạy tập lệnh với sudo


1

Dưới đây là một số thông tin với một vài lệnh có thể giúp ích, hãy xem http://ss64.com/bash/syntax-permissions.html

find . -type f -print0 | xargs -0 chmod 775 # change all file permissions in current directory

find . -type d -print0 | xargs -0 chmod 755 # change directory permissions

Bạn có thể sử dụng tập lệnh tiêu đề sau. Đặt mkscript.shtrong của bạn $PATH. Thực thi mkscript.shtừ thư mục làm việc trong đó các tập lệnh python được lưu trữ. Kịch bản tạo một số thông tin tiêu đề hữu ích, đặt tiêu đề cho tập lệnh và làm cho nó có thể thực thi được, sau đó mở trình soạn thảo đã chọn; trong trường hợp của bạn VIM.

Tôi đã sửa đổi mkscript.sh, nó sẽ tạo ra các script với phần mở rộng python*.py

Biến ${PYTHON_VERSION}được gọi, vì vậy PYTHON_VERSION="/usr/bin/python --version"đã được thêm vào /etc/environmenttập tin. Hãy xem https://help.ubfox.com/community/EnvirVariables

#!/bin/bash -       
#title           :mkscript.sh
#description     :This script will make a header for a PYTHON script.
#author      :bgw
#date            :20111101
#version         :0.4    
#usage       :bash mkscript.sh
#notes           :Install Vim and Emacs to use this script.
#bash_version    :4.1.5(1)-release
#==============================================================================

today=$(date +%Y%m%d)
div=======================================

/usr/bin/clear

_select_title(){

    # Get the user input.
    printf "Enter a title: " ; read -r title

    # Remove the spaces from the title if necessary.
    title=${title// /_}

    # Convert uppercase to lowercase.
    title=${title,,}

    # Add .sh to the end of the title if it is not there already.
    [ "${title: -3}" != '.py' ] && title=${title}.py

    # Check to see if the file exists already.
    if [ -e $title ] ; then 
        printf "\n%s\n%s\n\n" "The script \"$title\" already exists." \
        "Please select another title."
        _select_title
    fi

}

_select_title

printf "Enter a description: " ; read -r dscrpt
printf "Enter your name: " ; read -r name
printf "Enter the version number: " ; read -r vnum

# Format the output and write it to a file.
printf "%-16s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%s\n\n\n" '#!/usr/bin/python -' '#title' ":$title" '#description' \
":${dscrpt}" '#author' ":$name" '#date' ":$today" '#version' \
":$vnum" '#usage' ":./$title" '#notes' ':' '#python_version' \
":${PYTHON_VERSION}" \#$div${div} > $title

# Make the file executable.
chmod +x $title

/usr/bin/clear

_select_editor(){

    # Select between Vim or Emacs.
    printf "%s\n%s\n%s\n\n" "Select an editor." "1 for Vim." "2 for Emacs."
    read -r editor

    # Open the file with the cursor on the twelth line.
    case $editor in
        1) vim +12 $title
            ;;
        2) emacs +12 $title &
            ;;
        *) /usr/bin/clear
           printf "%s\n%s\n\n" "I did not understand your selection." \
               "Press <Ctrl-c> to quit."
           _select_editor
            ;;
    esac

}

_select_editor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.