我现在正在学习 Groovy,遇到了一些我不明白的事情,希望您能够提供一些帮助。
关于以下示例:
import groovy.transform.Field
@Field List awe = [1, 2, 3]
def awesum() { awe.sum() }
assert awesum() == 6
Run Code Online (Sandbox Code Playgroud)
我知道这种锚定允许我将 awe 变量的范围从在脚本的方法级别运行更改为脚本的类级别。
但后来我想到了使用 def 定义变量与不使用 def 定义变量之间的区别,例如:
def var = "foo"
Run Code Online (Sandbox Code Playgroud)
和
var = "foo"
Run Code Online (Sandbox Code Playgroud)
据我了解,这两个示例之间的差异是范围的差异。当我在 Groovy 脚本中为没有“def”或其他类型的变量分配值时,它会添加到“绑定”(脚本的全局变量)中。这意味着可以从脚本中的所有函数访问它。
因此,考虑到“@Field”和不使用“def”定义变量并遵循这一思路,我将示例代码更改为:
import groovy.transform.Field
awe = [1, 2, 3]
def awesum() { awe.sum() }
assert awesum() == 6
Run Code Online (Sandbox Code Playgroud)
它有效。
所以我的问题是为什么要使用锚定?如果您可以通过定义不带“def”的变量来实现相同的目标?
Jenkins中是否有一个环境变量告诉我构建是手动运行还是轮询自动触发?
如果自动触发,我的管道就像魅力一样,但如果手动运行......它总是失败,所以我想我要编辑管道来检查构建是如何被触发的.
我用来jq解析 AWS cli 的一些输出。
我正在尝试使用'select(startswith("$variable") )',但由于某种原因它不起作用,即使当我使用变量的值时它也可以正常工作。
例子:
itai@MacBook-Pro ~/src/Scripts - $ echo $App
Analytics
itai@MacBook-Pro ~/src/Scripts - $ aws cloudformation describe-stacks --stack-name $StackName --region $region | jq -r '.Stacks[].Outputs[].OutputKey | select(startswith("Analytics") )'
AnalyticsAutoScalingGroup
itai@MacBook-Pro ~/src/Scripts - $ aws cloudformation describe-stacks --stack-name $StackName --region $region | jq -r '.Stacks[].Outputs[].OutputKey | select(startswith("$App") )'
itai@MacBook-Pro ~/src/Scripts - $
Run Code Online (Sandbox Code Playgroud)
我知道我可以像这样使用 grep :
aws cloudformation describe-stacks --stack-name $StackName --region $region | jq -r '.Stacks[].Outputs[].OutputKey' | grep $App
Run Code Online (Sandbox Code Playgroud)
但我更喜欢在命令中始终使用 jq 。
我做错了还是根本不可能?
我创建了下一个脚本以找到锁定文件的年龄:
#!/bin/bash
now=`date +"%T"`
lock="aggregator.lock"
find . -name $lock -type f
if [ $? != 0 ];
then
exit
else
ls -ltrh $lock 2&>/dev/null
fi
if [ $? != 0 ];
then
locktime=`ls -ltrh aggregator.lock |awk -F" " '{print $7}'`
else
echo "File not found"
fi
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
ls -ltrh aggregator.lock |awk -F" " '{print $7}'
给我时间格式为HH:MM而不是HH:MM:SS,输出date +"%T"给出时间格式为HH:MM:SS(根据需要),那么如何获取文件的修改时间几秒钟?$now - $locktime为了获得两个变量之间的秒增量,怎么做呢?编辑:脚本的含义是找到锁文件存在多长时间...这是脚本:
device0="/home/build/aggregator/scripts/aggregator.lock"
if [ -e "$device0" ]
then
echo process is allready running
else
touch …Run Code Online (Sandbox Code Playgroud) 我写了一个CloudFormation模板,它创建了一个linux docker主机.
我想在"输出"部分下显示机器的PublicIP.
这是模板的相关部分:
"Outputs" : {
"ServerAddress" : {
"Value" : { "Fn::GetAtt" : [ "Server", "PublicDnsName" ] },
"Description" : "Server Domain Name"
},
"SecurityGroup" : {
"Value" : { "Fn::GetAtt" : [ "ServerSecurityGroup", "GroupId" ] },
"Description" : "Server Security Group Id"
},
"PublicIp" : {
"Value" : { "Fn::GetAtt" : [ "ServerPublicIp", "PublicIp" ]},
"Description" : "Server's PublicIp Address"
},
}
Run Code Online (Sandbox Code Playgroud)
我在官方AWS文档中读到了关于使用"Fn :: GetAtt"并尝试在我的模板中实现它,但是当我尝试创建堆栈时,我收到以下错误:
Error
Template validation error: Template error: instance of Fn::GetAtt references …Run Code Online (Sandbox Code Playgroud) 我正在尝试获得以下输出pwd:
#!python
import os
pwd = os.system("pwd")
print (pwd)
Run Code Online (Sandbox Code Playgroud)
它打印0,这是成功的退出状态而不是路径.我怎样才能获得这条路?
我正在编写一个脚本,它将使用正确的设置自动配置NIS客户端.我正在尝试设置/etc/nsswitch.conf文件,我想用我的设置覆盖已存在的任何内容.现在我的问题是,我该怎么做?如何直接从脚本中将大约20行设置粘贴到客户端的nsswitch.conf文件中?我知道我可以这样做:
echo "line 1" > /etc/nsswitch.conf
echo "line 2" >> /etc/nsswitch.conf
Run Code Online (Sandbox Code Playgroud)
但这是一种难看的方式,我希望有更好的方法来实现这一目标
我在脚本中有这个部分:
cat <<EOF >> /etc/httpd/vhosts/$site$dom.conf
<VirtualHost *:80>
ServerName $site$dom
ServerAlias www.$site$dom
DocumentRoot /site/http/travel/itn
CustomLog logs/access_$site_log combined
DirectoryIndex default.php index.php index.html index.phtml index.cgi index.htm
ScriptAlias /awstats/ /usr/local/awstats/wwwroot/cgi-bin/
<Directory /site/http/travel/itn >
AllowOverride All
</Directory>
</VirtualHost>
EOF
Run Code Online (Sandbox Code Playgroud)
在行中:CustomLog logs/access_$site_log combined
似乎解释器认为_log是"$ site"变量的一部分.$ site变量是一个动态变量.我该如何解决?我试图通过使用逃避"_",_$site\_但它对我不起作用.
有什么区别
[ -e /usr/local/nagios ] && echo yes
Run Code Online (Sandbox Code Playgroud)
和
if [ -e /usr/local/nagios ]; then echo yes
fi
Run Code Online (Sandbox Code Playgroud)
什么时候适合使用它们中的任何一个?
假设我想测试 Nagios 是从源代码编译还是通过 yum 安装(源代码的默认安装位置是/usr/local/nagios并通过YUM它/etc/nagios) - 然后我会知道插件文件夹所在的位置,并且它将允许我从 Nagios 中提取插件服务器到 Nagios 客户端并将它们放在正确的目录中。那么哪种方法最能实现这一目标呢?
提前致谢
我正在尝试使用log.io构建一个docker容器.如果我手动运行:
docker run -it node:argon -p 28777:28777 -p 28778:28778 -p 8000:80 /bin/bash
Run Code Online (Sandbox Code Playgroud)
并在您在Dockerfile中看到的命令内手动运行,然后一切正常,我可以使用http登录服务.
FROM node:argon
WORKDIR Logz.io/src/
RUN useradd -ms /bin/bash ubuntu
#RUN mkdir /root/.log.io \
# && touch /root/.log.io/harvester.conf \
# && touch /root/.log.io/log_server.conf \
# && touch /root/.log.io/web_server.conf
#RUN chmod g+rwx /root/logzio
RUN apt-get update \
&& apt-get install -y vim net-tools
RUN npm install log.io
RUN /node_modules/log.io/bin/log.io-server &
RUN /node_modules/log.io/bin/log.io-harvester &
EXPOSE 28777
EXPOSE 28778
EXPOSE 8000
Run Code Online (Sandbox Code Playgroud)
但如果我跑:
docker build .
Run Code Online (Sandbox Code Playgroud)
创建容器,一切都安装但是:
- 当创建完成并且我运行时 …