web-dev-qa-db-ja.com

Linuxで実行可能ファイルを作成する

私がやろうとしていることの1つは、(非常に単純な)Perlスクリプトを作成することです。端末からPerlを明示的に呼び出さずにそれらを実行できるようにしたいと思います。これを行うには、実行権限を付与する必要があることを感謝しています。 chmodでこれを行うのは簡単ですが、少し面倒な余分なステップのようにも見えます。私が望むのは、次の2つのいずれかです。

まず、ファイルを保存するときに実行フラグを設定する方法はありますか?現在、私はgeditとgeanyを実験していますが、この機能があれば、同様の(またはより良い)機能のエディターに切り替えたいと思っています。

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

私の知る限り、umaskは022に設定されていますが、ファイルは実行可能ファイル(デフォルトの777の許可)ではなく、テキストファイル(デフォルトの666の許可)として作成されているようです。

たぶん私は怠けているだけかもしれませんが、作成するすべてのスクリプトをchmoddingするよりも便利な方法があるはずです。

41
user100246

ファイルを実行可能にする:

chmod + xファイル

Perlの場所を見つける:

どのPerl

これは次のようなものを返すはずです

/ bin/Perl時々/ usr/local/bin

次に、スクリプトの最初の行に次を追加します。

#! "path" /上記のパスを含むPerl.

#!/ bin/Perl

その後、ファイルを実行できます

。/ファイル

PATHに問題がある可能性があるため、同様に変更することもできます。

86
user735

エディターをハックしたり、エディターを切り替えたりする必要はありません。

代わりに、作成された開発ディレクトリとchmodファイルを監視するスクリプトを作成できます。これは、添付のbashスクリプトで行ったことです。おそらくコメントを読み、ニーズに合わせて「config」セクションを編集したい場合は、$ HOME/bin /ディレクトリに配置し、その実行を$ HOME/.loginまたは同様のファイルに追加することをお勧めします。または、ターミナルから実行することもできます。

このスクリプトにはUbuntuのinotify-toolsパッケージに含まれるinotifywaitが必要です。

Sudo apt-get install inotify-tools

提案/編集/改善は大歓迎です。

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

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

GUIにとどまると言いました。通常、ファイルプロパティメニューから実行ビットを設定できます。コンテキストメニューのカスタムアクションを作成する方法を学習することもできます。もちろん、これはデスクトップ環境に依存します。

より高度なエディターを使用する場合は、ファイルが保存されたときに実行されるアクションのスクリプトを作成できます。たとえば(私は本当にvimに精通しています)、これを.vimrcに追加して、「#!/*/bin/*」実行可能ファイルで始まる新しいファイルを作成できます。

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

それほど大きな問題ではありません。単一のコマンドでスクリプトを作成できます。

chmod a+x *.pl

Perlファイルを作成した後、スクリプトを実行します。または、次のようなコマンドでファイルを開くことができます。

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

あなたが実行している問題は、システムに独自のumask値を設定できるにもかかわらず、gedit(または使用するエディタ)によって新しいファイルに設定されたデフォルトのパーミッションを明示的に制御できないことだと思います。

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

これに照らして、ファイルをchmodしなければならないのはそれほど悪くないでしょう?

0
grossvogel