我有一个包装器外壳脚本,需要在调用编译器之前添加一些库并包含路径。
#!/bin/sh
LDIRS="-L/opt/lib"
LDFGS="-llibA -llibB"
exec /opt/bin/xxx $@ $LDIRS $LDFGS
这对于编译一个简单的测试用例非常有用
compiler -o test test.c
如果另一个程序想要调用我的编译器并传递包含这样的包含目录,则会崩溃
compiler -o in_file.xx -I/xxx -I/xxx
如何概括这一点,以获得将那些包含附加到LDFGS的预期行为?
答案 0 :(得分:1)
我认为var j = "{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:16.881\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":527,\"Message\":\"SyncData: Billing Software SyncData() called\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.060\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":38,\"Message\":\"SyncData: Start\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.111\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":44,\"Message\":\"SyncData: LocalConnectionString = Data Source=PARAM\\\\MSSQL2K8r2;Initial Catalog=HQPharma;User ID=sa;Password=developer;\"}";
for(var key in j){
console.log(j[key]);
}
和LDIRS
的顺序是相关的问题;用户提供的其他内容应该以LDFGS
结尾(即需要在所有LDFGS
至{{1 }}),但不要使用当前的实现。因此,我认为将LDIRS
参数添加到/opt/bin/xxx
中。如果我误解了您的问题,请更清楚地说明您想要的内容。否则请继续阅读。
您有两种选择来解决这样的问题。您要么实现某种智能,要么理解给定的选项,然后将其正确分类到它们所属的列表中。一种解决方法可能是这样的:
-I/xxx
正如@ charles-duffy所指出的那样,如果您的任何参数包含空格,则使用支持适当列表的LDFGS
或类似名称会更健壮。如果您确定不会发生这种情况,那么现在应该可以了。但是当您的代码维护者因此而陷入麻烦时,他们会讨厌您。因此,#!/bin/sh
LDIRS="-L/opt/lib"
LDFGS="-llibA -llibB"
PRE=""
for argument in "$@"
do
case "$argument" in
-I*)
LDFGS="$LDFGS $argument"
;;
# other patterns could go here as well
*) # else case
PRE="$PRE $argument"
;;
esac
done
exec /opt/bin/xxx $PRE $LDIRS $LDFGS
中的一个可读性较低的版本应解决此问题:
bash
(每当使用sh
时,都需要添加免责声明:#!/bin/sh
LDIRS="-L/opt/lib"
LDFGS="-llibA -llibB"
PRE=""
for argument in "$@"
do
case "$argument" in
-I*)
LDFGS=`printf "%s %q" "$LDFGS" "$argument"`
;;
# other patterns could go here as well
*) # else case
PRE=`printf "%s %q" "$PRE" "$argument"`
;;
esac
done
eval "exec /opt/bin/xxx $PRE $LDIRS $LDFGS"
带有危险,其中一些与安全性相关,因此请在广泛使用它之前了解更多有关此危险的信息。不过,这种情况应该没问题。)
如果您认为无法了解应该进入eval
,eval
和LDFGS
的所有模式,则需要将其交给用户。不幸的是,那么用户需要了解更多并传递此信息。然后,呼叫将需要看起来有所不同。
一种方法是这样
LDIRS
现在通话需要看起来像这样:
PRE
同样,如果您遇到空间问题,则应考虑使用适当的阵列解决方案,或者至少考虑我上面提出的丑陋解决方法。