2009-05-03 24 views
37

私がしようとしていることの1つは、Perlスクリプトを書くことです(痛いほど単純な)、Perlをターミナルから明示的に呼び出さなくても実行できるようにしたいと思います。私は、これを行うために、私は彼らに許可を実行する権限を与える必要があることを感謝します。これをchmodで行うのは簡単ですが、少し面倒な余分なステップのように思えます。私が望むのは2つのうちの1つです:Linuxで実行可能ファイルを作成する

まず、ファイルを保存するときに実行フラグを設定する方法はありますか?現在、私はgeditとgeanyを試していますが、この機能を持っていれば同様の(またはより良い)特集編集者に切り替えることができます。

特定のディレクトリに作成されたすべてのファイルに実行権限が必要であることを宣言する方法はありますか?

私の理解する限り、umaskは022に設定されていますが、実行可能ファイル(デフォルトの権限は777)ではなくテキストファイル(666デフォルトのアクセス権) 。

おそらく私は怠け者になっているかもしれませんが、作成するすべてのスクリプトをchmoddingするよりも便利な方法があるはずです。

+0

すべてのファイルの出力を印刷する必要があります。すべてのファイルの適切なライブラリをインポートする必要があります。これはプログラミングのプロセスのもう1つのステップ、および回避するために危険なものと思われます。 – JFA

答えて

2

本当に大したことではありません。

chmod a+x *.pl 

そして、perlファイルを作成した後にスクリプトを実行してください。

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

私はGUIですべてをやり遂げる方法をもっと探していましたが、おそらくこれは不可能です。それはセキュリティの問題ですか? –

+0

はい、セキュリティの問題です。シェルがデフォルトで実行可能なものすべてを作成し始めた場合、大きな問題になる可能性があります。 – JimB

+0

これを行う簡単なプログラムを作ることができます。しかし、正直言って、あなたはUNIX環境のプログラムが実際にやっていることを誰もやらないようにしようとしています。 – BobbyShaftoe

80

メイクファイルを実行可能:

ます。chmod + Xのperlの

検索場所のファイル:

を別の方法として、あなたはこのようなコマンドでファイルを開くことができ

perl

これは、スクリプトの最初の行に続いて

/binに/ perlのようなもの、時々は/ usr/local/binに

を返す必要があります追加:

# "パス! "/上のパスを持つperl

#!/ binに/ perlの

次に、あなたがしたいことがありので、PATHを持ついくつかの問題があるかもしれません

./fileファイル

を実行することができますそれを変更するには...

+0

ありがとうございますが、それは私の問題ではありません。私は既に#!/ usr/bin/perlでスクリプトを起動する習慣に入っています。実行可能な権限を与えたらスクリプトをうまく実行できます。私はもっ​​と簡単な方法を探していました。 –

+11

代わりに '#!/ usr/bin/env perl'をお勧めしますか? 'env'プログラムは、基本的にPATH上で与えられた引数(この場合は" perl ")を見つけて実行します。これは、スクリプトを他の人に送るときに便利です。たとえば、Macを使い、Perlは/ opt/local/binにあります。 –

3

これを処理する正しい方法はあなたの説明です。

あなたはGUIにとどまりたいと言いました。通常、ファイルプロパティメニューから実行ビットを設定できます。また、コンテキストメニューのカスタムアクションを作成して、そうすることができる場合は、その方法を学ぶこともできます。もちろん、デスクトップ環境によって異なります。

さらに高度なエディタを使用している場合、ファイルを保存するときに実行するアクションをスクリプト化できます。例えば(私はvimに精通しているだけです)、これを.vimrcに追加して、 "#!/*/bin/*"で始まる新しいファイルを実行可能にすることができます。

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

このヒントを使用して、私はここに記載された問題に遭遇しました:https://bbs.archlinux.org/viewtopic.php?id=126304 これで私はちょっと修正されたバージョンの 'autocmd BufWritePost * getline )=〜 "^#!/ bin /" |サイレント実行 "!chmod a + x " | endif' – Gautam

0

私はあなたに実行している問題では、システムで独自のumask値を設定することが可能にもかかわらず、これはあなたが明示的にgeditのことで、新しいファイルに設定されたデフォルトのアクセス権を制御することはできません、ということだと思います(またはあなたが使っているエディタ)。

この詳細は、geditや他のほとんどのエディタにハードコードされていると思います。それを変更するためのオプションは、(a)geditの独自のmodをハッキングすること、(b)新しいファイルに対するデフォルトのアクセス権を設定できるテキストエディタを見つけることです。 (申し訳ありませんが、私には分かりません)

これに照らして、ファイルをchmodする必要はありません。

5

エディタをハックする必要はなく、エディタを切り替える必要もありません。

代わりに、開発ディレクトリとchmodファイルが作成されているのを見るためのスクリプトを用意することができます。これは、私が付属のbashスクリプトで行ったことです。コメントを読んで、あなたのニーズに合った 'config'セクションを編集したいなら、あなたの$ HOME/bin /ディレクトリに置いて実行を$ HOME/.loginまたは同様のファイルに追加することをお勧めします。または、端末から実行するだけでも構いません。

このスクリプトは

sudo apt-get install inotify-tools 

提案/編集/改善は歓迎されている、Ubuntuの上のinotify-toolsパッケージで提供されますinotifywaitを、必要としません。

#!/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

ディレクトリにumaskを設定する方が簡単でしょうか? –

関連する問題