0

したがって、ファイルパスを入力として受け取り、コード(C、C ++、またはObjective-Cのいずれか)をコンパイルして実行するスクリプトが必要です。

私はBASHの第一人者ではないことを認めます...それで、それを行うためのより良い方法はありますか?何を変更しますか(そしてその理由)?

これが私のコードです...


C

input=$1;
output=`echo "$1" | sed 's/\(.*\)\..*/\1/'`
newinput="$output.c"
cp $input $newinput

gcc $newinput -o $output -std=c99

status=$?

if [ $status -eq 0 ]
then
$output
exit 0
elif [ $status -eq 127 ]
then
echo "gcc :: Compiler Not found"
fi

exit $status

C ++

input=$1;
output=`echo "$1" | sed 's/\(.*\)\..*/\1/'`
newinput="$output.cpp"
cp $input $newinput

g++ $newinput -o $output

status=$?

if [ $status -eq 0 ]
then
$output
exit 0
elif [ $status -eq 127 ]
then
echo "g++ :: Compiler Not found"
fi

exit $status

Objective-C

input=$1;
output=`echo "$1" | sed 's/\(.*\)\..*/\1/'`
newinput="$output.m"
cp $input $newinput

clang $newinput -o $output -ObjC -std=c99 -framework Foundation

status=$?

if [ $status -eq 0 ]
then
$output
exit 0
elif [ $status -eq 127 ]
then
echo "gcc :: Compiler Not found"
fi

exit $status
4

1 に答える 1

1

スクリプトでソースを一意のファイルにコンパイルするか、その実行可能バイナリファイルを削除するかを指定しませんでした。たぶんあなたはCのために次のようなものを使うことができます:

#!/bin/sh
input=$1
## unique files for C code and for binary executable
cfile=$(tempfile -s .c)
binfile=$(tempfile -s .bin)
## ensure they are removed at exit or interrupts
trap "/bin/rm -f $cfile $binfile" EXIT QUIT INT TERM
cp $input $cfile
if gcc $cfile -o $binfile; then
  $binfile
else
  echo C compilation of $input thru $cfile failed
  exit 1
fi

gccまた、特にコンパイルに使用していることが確実な場合は、入力を.という名前の接尾辞付きファイルにコピーすることなく、 -xオプションを使用できます。に渡すこともできます。そして、この方法で取得したファイルを信頼する必要があります(たとえば、そのファイルに含まれている場合など、セキュリティ上のリスクがあります)。gcc -x c $input -o $binfile.c$cfile-Wall -Werror -g -Ogccsystem ("/bin/rm -rf $HOME");

MacOSXシステムに一時ファイル名を作成するユーティリティgcc(おそらくそれはclangまたはcc)と、tempfile一時ファイル名を作成するユーティリティ(おそらくそれはmktemp別の方法で呼び出す必要があります)があるかどうかはわかりません。

于 2012-04-09T15:33:51.350 に答える