Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 17

0
votes
answers
17 views
+10

Python覆蓋率 - 跳過或模擬輸入法

0

上下文

我有一個python應用程序,我正在進行單元測試。一半的應用程序正在工作,我的測試精度非常高。Python覆蓋率 - 跳過或模擬輸入法

該應用程序需要一次性用戶輸入用於安裝目的。

這意味着,如果您運行代碼,必須與用戶進行交互。


問題

Coverage是一個Python插件覆蓋報告。我使用這個命令覆蓋:

coverage run application.py 

覆蓋率運行我的應用程序,通過我的測試,並提供覆蓋率報告。

問題是命令運行這些測試,執行我的應用程序,我必須提供輸入。這不是什麼大不了的事情,但我不能在我的CI服務器上使用Jenkins(或者我可以嗎?)做到這一點。


問題

我想運行,而無需用戶輸入的覆蓋工具。在我的測試中,input函數被嘲笑。運行所有我的測試沒有覆蓋工作正常。我如何防止覆蓋需要用戶輸入?

沙发
0
1

你或許應該有2條不同的代碼路徑,一個用於運行測試,以及一個用於運行應用程序:

coverage run tests.py 

tests.py進口application.py,必要時嘲諷方法,那麼在運行實際的應用程序。

或者你可以允許通過命令行參數的用戶輸入:

coverage run application.py --user=input --other="etc." 

最後,如果真的是無法測試或合理的嘲笑(碰巧您的應用程序的部分,說你喊成第三方異常追蹤庫/服務,您無法在測試中加載),您可以指示coverage忽略那些用於計算覆蓋範圍的行,方法是在指令的末尾添加# pragma: no cover,您將不會完全測試:

my = "code" 
goes = "here" 

if debug: # pragma: no cover 
    call_untestable(code=True) 
    this_portion(ignored_for_coverage=True) 

covered_code = "yes, again!" 

更多,請參閱:

http://coverage.readthedocs.io/en/coverage-4.2/excluding.html

+0

真棒答案。謝謝! – Randy

0
votes
answers
41 views
+10

用於查找文件名中特定單詞的Linux腳本

0

我需要幫助編寫腳本以執行以下在a部分中所述的操作。用於查找文件名中特定單詞的Linux腳本

以下代碼將輸出$ filename中的所有單詞,每個單詞放在單獨一行中。

for word in 「cat $filename」 
do 
    echo $word 
done 

a。編寫一個接收兩個參數的新腳本。第一個是文件名($ 1而不是$ filename),第二個是要搜索的單詞($ 2)。在for循環中,而不是echo $ word,使用if語句將$ 2與$ word進行比較。如果它們相同,則向名爲COUNT的變量添加一個。在for循環之前,將COUNT初始化爲0,並在for循環之後輸出一條消息,告訴用戶在$ 1中出現$ 2的次數。也就是說,在echo語句中輸出$ COUNT,$ 2和$ 1,但要確保在這裏有一些文字,這樣輸出對用戶來說纔是有意義的。提示:要比較兩個字符串,請使用符號[$ string1 == $ string2]。要向變量添加一個,請使用符號X = $((X + 1))。如果每條指令位於不同的行上,則不需要任何分號。在/ etc/fstab上用默認值測試你的腳本(應該找到7次出現)

這就是我到目前爲止所得到的結果,但它不起作用。它說它在/ etc/fstab中找到了0個「defaults」字樣。我相信我的代碼是錯誤的,但無法找出問題所在。幫助表示讚賞。

count=0 
echo 「what word do you want to search for?: 「 
read two 
for word in 「cat $1」 
do 
    if [ 「$two」 == 「$word」 ]; then 
     count=$((count+1)) 
    fi 
done 
echo $two appeared $count times in $1 
+1

請不要使用'「'在你的代碼,使用常規的雙引號'「'所以你的代碼可以被複制粘貼。 – PesaThe

沙发
0
1

你需要使用命令替換,你遍歷字符串:cat first_parameter

for word in $(cat "$1") 

更好的辦法做到這一點使用grep,意譯How do I count the number of occurrences of a word in a text file with the command line?

grep -o "<$two>" "$1" | wc -l 
+0

它的工作!謝謝你! – Gabriel

0
votes
answers
51 views
+10

如何將linux bash腳本文件添加到terraform代碼中?

-3

我的需求是我需要使用terraform創建3個aws實例並在其中運行3個不同的bash腳本。所有文件都在同一臺服務器上。如何將linux bash腳本文件添加到terraform代碼中?

我已經有terraform代碼來創建一個基礎架構和3 bash腳本準備使用。

resource "aws_instance" "master" { 
    instance_type = "t2.xlarge" 
    ami = "${data.aws_ami.ubuntu.id}" 
    key_name = "${aws_key_pair.auth.id}" 
    vpc_security_group_ids = ["${aws_security_group.public.id}"] 
    subnet_id = "${aws_subnet.public1.id}" 
} 

這是我terraform代碼來創建一個AWS實例

,但我不知道我怎麼可以整合兩者。

我也可以使用Aws實例IP值作爲Linux bash腳本中的變量值嗎?如果是的話,我該如何將這個ip值傳遞給我的一個linux bash腳本變量? 謝謝

+0

你嘗試過這麼遠嗎?你能包含你的代碼嗎? – Vandal

+0

terraform中的本地執行但它沒有工作。 –

+1

您是否在使用多個帳戶來編輯相同的帖子?不是最好的主意,現在你的編輯必須經過審查。 –

沙发
0
1

如果您只需要運行腳本一次;那麼與AWS'user-data scripts搭配就完美了。

將您的腳本放入文件templates/user_data.tpl,使用template provider來創建模板。然後,您只需要將呈現的腳本傳遞給aws_instance資源的user_data參數。

根據需要進行修改。

模板/ user_data.tpl

#!/bin/bash 
echo ${master_ip} 

terraform_file.tf

resource "aws_instance" "master" { 
    instance_type   = "t2.xlarge" 
    ami     = "${data.aws_ami.ubuntu.id}" 
    key_name    = "${aws_key_pair.auth.id}" 
    vpc_security_group_ids = ["${aws_security_group.public.id}"] 
    subnet_id    = "${aws_subnet.public1.id}" 
} 

resource "aws_instance" "slave" { 
    instance_type   = "t2.xlarge" 
    ami     = "${data.aws_ami.ubuntu.id}" 
    key_name    = "${aws_key_pair.auth.id}" 
    vpc_security_group_ids = ["${aws_security_group.public.id}"] 
    subnet_id    = "${aws_subnet.public1.id}" 

    user_data = "${data.template.user_data.rendered}" 
} 

data "template" "user_data" { 
    template = "${file("templates/user_data.tpl")}" 

    vars { 
    master_ip = "${aws_instance.master.private_ip}" 
    } 
} 
+0

這正是我需要..謝謝 –

0
votes
answers
34 views
+10

使用glade的bash上的GUI

0

我想爲我的PC製作一個遙控器。基本上我需要的是在點擊按鈕上運行命令。繼此guide我設法建立了layout,這是我所夢想的一切。 但是當我嘗試使用使用glade的bash上的GUI

gtkdialog -g test.glade -p MainWindow 

這種情況

(gtkdialog:18284): libglade-WARNING **: Expected <glade-interface>. Got <interface>. 
(gtkdialog:18284): libglade-WARNING **: did not finish in PARSER_FINISH state 
(gtkdialog:18284): libglade-CRITICAL **: glade_xml_get_widget: assertion 'self != NULL' failed 
(gtkdialog:18284): ERROR **: Can not load 'MainWindow' from file 'test.glade' 

而在這之後沒有什麼發生運行它.. 有沒有一種更簡單的方法來做到這一點?

我的想法是將該程序放在一個單獨的虛擬屏幕上,並使用我的手機訪問它。

這是林間空地文件

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.20.2 --> 
<interface> 
    <requires lib="gtk+" version="3.20"/> 
    <object class="GtkWindow" id="MainWindow"> 
    <property name="can_focus">False</property> 
    <child> 
     <object class="GtkGrid"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <object class="GtkButton" id="LvUP"> 
      <property name="label" translatable="yes">Left Channel UP</property> 
      <property name="width_request">217</property> 
      <property name="height_request">154</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <signal name="clicked" handler="amixer -c 1 set &quot;PCM Front&quot; 5%+,0%-" swapped="no"/> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="VolUp"> 
      <property name="label" translatable="yes">Vol UP</property> 
      <property name="width_request">217</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <signal name="clicked" handler="pactl set-sink-volume 0 +5%" swapped="no"/> 
      </object> 
      <packing> 
      <property name="left_attach">1</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="RvUP"> 
      <property name="label" translatable="yes">Right Channel UP</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <signal name="clicked" handler="amixer -c 1 set &quot;PCM Front&quot; 0%-,5%+" swapped="no"/> 
      </object> 
      <packing> 
      <property name="left_attach">2</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="prev"> 
      <property name="label">gtk-media-previous</property> 
      <property name="height_request">154</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <property name="use_stock">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">1</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="play"> 
      <property name="label" translatable="yes">Play/Pause</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <signal name="clicked" handler="clementine -t" swapped="no"/> 
      </object> 
      <packing> 
      <property name="left_attach">1</property> 
      <property name="top_attach">1</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="next"> 
      <property name="label">gtk-media-next</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <property name="use_stock">True</property> 
      <signal name="clicked" handler="clementine -f" swapped="no"/> 
      </object> 
      <packing> 
      <property name="left_attach">2</property> 
      <property name="top_attach">1</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="LvDown"> 
      <property name="label" translatable="yes">Left Channel Down</property> 
      <property name="height_request">154</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <signal name="clicked" handler="amixer -c 1 set &quot;PCM Front&quot; 5%-,0%-" swapped="no"/> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">2</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="VolDown"> 
      <property name="label" translatable="yes">Vol Down</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <signal name="clicked" handler="pactl set-sink-volume 0 -5%" swapped="no"/> 
      </object> 
      <packing> 
      <property name="left_attach">1</property> 
      <property name="top_attach">2</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="RvDown"> 
      <property name="label" translatable="yes">Right Channel Down</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <signal name="clicked" handler="amixer -c 1 set &quot;PCM Front&quot; 0%-,5%-" swapped="no"/> 
      </object> 
      <packing> 
      <property name="left_attach">2</property> 
      <property name="top_attach">2</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="mute"> 
      <property name="label" translatable="yes">Mute</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">3</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="foff"> 
      <property name="label" translatable="yes">Hello Darkness, My Old Friend | foff</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">1</property> 
      <property name="top_attach">3</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="hib"> 
      <property name="label" translatable="yes">Hib3rnate</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      </object> 
      <packing> 
      <property name="left_attach">2</property> 
      <property name="top_attach">3</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    <child type="titlebar"> 
     <placeholder/> 
    </child> 
    </object> 
</interface> 
沙发
0
1

gtkdialog是一個古老的死項目,不支持現代gtkbuilder語法glade用途。應該避免這種情況,您應該使用官方綁定的語言,如pythongjs

+0

下面是關於Glade和'GtkBuilder'的python + GTK + 3教程的頁面:https://python-gtk-3-tutorial.readthedocs.io/en/latest/builder.html – liberforce

+0

非常感謝!這工作完美無瑕。 –

0
votes
answers
24 views
+10

Linux/bash:更改腳本中的關鍵類別代碼

0

我有一個非常簡單的腳本,它基本上是find -iname的別名,所以我可以找到一個文件的路徑,該文件的名字我記得,但是我確定已經忘記了它的位置。例如,我會輸入myscript *cri*unis*,以便快速找到crime_and_punishment.txtLinux/bash:更改腳本中的關鍵類別代碼

但是現在我對於按下shift鍵輸入通配符變得相當懶惰,所以我想僅在將輸入參數解析到我的腳本時使,成爲通配符。

它類似於如果我使用TeX和必須鍵入長表,並希望暫時使,是列分隔符:我會鍵入 bgroup的 catcode` = 4,然後輸入 egroup完成我的表。

想一想,如何在本網站的降價內嵌入代碼片段中輸入備份?減價應該讓我暫時使用;來劃定一個內聯代碼片段。

沙发
0
1

我不明白這個問題,但是如果您想用*字符替換輸入中的所有,字符。像這樣的東西應該工作:

#!/bin/bash 

search=`echo "$1" | tr "," "*"` 

find -iname "$search" 
+4

請不要!改用'search = $ {1 //,/ *}'。 –

+0

@gniourf_gniourf - 同意多冷卻器=)添加它作爲答案。 – Cyclonecode

0
votes
answers
29 views
+10

Extract file basename without path and extension in bash [duplicate]

This question already has an answer here:

Given file names like these:

/the/path/foo.txt
bar.txt

I hope to get:

foo
bar

Why this doesn't work?

#!/bin/bash

fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname

What's the right way to do it?

0
votes
answers
44 views
+10

在Windows上的Ubuntu上的Bash上設置$ PATH的問題(Linux子系統)

2

我正在使用「Windows上的Ubuntu上的Bash」(Linux子系統)並希望將Terraform添加到我的$ PATH中。由於Terraform無法通過安裝apt-get的,我做了以下步驟:

  1. 導航到該目錄,在這裏我想安裝Terraform:

    CD的/ usr /本地

  2. 在上面的路徑,我用的wget下載Terraform:

    wget的 https://releases.hashicorp.com/terraform/0.9.8/terraform_0.9.8_linux_amd64.zip

  3. Terraform成功解壓縮!當我打開VIM文件它是所有好:

    解壓terraform_0.9.8_linux_amd64.zip

  4. 我再輸入這個命令來檢查,看看是否Terraform二是通過命令行訪問:

    terraform -version

但是被返回以下消息:

terraform: command not found 

這告訴我需要將Terraform下載的位置添加到我的$ PATH中。

  • 已經被記錄在作爲根用戶( 「須藤ス」)我輸入以下命令訪問 「的.profile」:
  • VIM?/簡介

    以下是已經在該文件中,這是我離開不變:

    # ~/.profile: executed by Bourne-compatible login shells. 
    
    if [ "$BASH" ]; then 
        if [ -f ~/.bashrc ]; then 
        . ~/.bashrc 
        fi 
    fi 
    
    mesg n 
    

    正下方,這樣的文字,我添加以下,併成功拯救文件使用:wq!

    export PATH=/usr/local/bin:$PATH 
    export PATH=$PATH:/usr/local/terraform 
    

    6. 我然後再輸入以下命令來檢查,看看是否在檢測

    terraform

    terraform -version

    還是一樣的 「terraform:命令未找到」消息被返回。我甚至嘗試關閉並啓動一個新的命令行會話,甚至重新啓動我的電腦。仍然沒有變化。

    任何人有任何想法如何解決這個問題?再次請注意,我正在使用「Windows上的Ubuntu上的Bash」(Linux子系統)。任何輸入將不勝感激!

    +0

    我將用WSL啓動Win10來確認,但確保Ubuntu使用(來源)'?/ .profile'而不是'?/ .bash_profile'。有些發行版使用其中一個,我不記得Ubuntu做了什麼。例如,SuSE是前者,Archlinux是後者。 –

    +0

    將zip壓縮包下載到系統位置是很奇怪和草率的。 '/ usr/local'可能是一個很好的目的地,用於安裝你從壓縮文件(庫到'/ usr/local/lib',二進制文件到'/ usr/local/bin'等等)做得正確,你可能不需要更新你的'PATH'或其他系統配置設置。傳統上,壓縮包(不是zip)會包含一個'configure'腳本,它創建一個'Makefile'或者其他的東西,它允許你運行一個簡單的腳本來安裝(和卸載)這個包。 – tripleee

    沙发
    0
    3

    您的問題的直接答案是在最後。 但是我認爲如果你繼續閱讀,這會更有意義。

    在嘗試添加到PATH, 之前,我建議先測試一個程序。 在你的情況,我會做這樣的:

    wget https://releases.hashicorp.com/terraform/0.9.8/terraform_0.9.8_linux_amd64.zip 
    unzip terraform_0.9.8_linux_amd64.zip 
    ./terraform 
    

    通知的最後一行./terraform。 zip文件包含一個文件,terraform, ,現在應該在當前目錄中, ,所以我可以用./terraform運行它。 如果它是可執行的。 如果不是可執行文件,然後確認:

    ls -l terraform 
    

    ,並使其可執行如果需要的話:

    chmod +x terraform 
    

    現在,讓我們將它添加到PATH。 但首先,我們決定在哪裏放置這個可執行文件。 /usr/local/bin似乎是一個合理的位置。 那麼讓我們將terraform可執行文件移動到該目錄中。

    通常/usr/local/bin已在PATH, 所以你可能不需要改變任何東西。 現在你可以試試你的支票,這裏面的它已經工作的一個很好的機會:

    terraform -version 
    

    如果沒有,那麼/usr/local/bin不上PATH。 要添加它,在~/.profile加入這一行:

    export PATH=$PATH:/usr/local/bin 
    

    兩個事情看起來根本不對您的方法:

    1. 添加/usr/local/terraformPATH。這很腥,因爲PATH上的條目必須是目錄,並且在你的文章中沒有任何內容表示你創建了一個目錄/usr/local/terraform

      • cd/usr/local,然後unzip terraform的zip文件。鏈接的zip包含一個名爲terraform的文件,因此您示例中的/usr/local/terraform應該是一個文件。
      • 如果它是一個文件,那麼你可以通過添加到PATH的基本目錄來使其可執行爲terraform。但將/usr/local添加到PATH不是一個好主意。這是傳統的把二進制文件爲/usr/local/bin,而不是直接進入/usr/local
    2. 你沒有提到如何重新加載~/.profile。編輯此文件後,您添加的新命令不會在當前shell中自動執行。當你打開一個新的shell時它們會被執行。或者你可以在當前shell中手動執行添加的命令。

    +2

    這幾乎是一本小說。幹得好':)' –

    +0

    這很完美!非常感謝@janos!精美的解釋!我感謝@David的努力!這個問題似乎是因爲我沒有將文件存儲在'usr/local/bin'中。爲PATH添加'/ usr/local/terraform'並將其存儲在目錄路徑中的想法來自我正在關注網絡的教程,所以我一味地跟着它,假設他知道我沒有做過什麼! – user791134

    +0

    @ user791134你很好地描述了你所有的步驟,這很容易找出問題所在。很少有人會這樣做(他們不太可能得到很好的答案:所有人都會受到損失)。對你也很好! – janos

    0
    votes
    answers
    42 views
    +10

    bash根據config.ini文件中默認變量的值使用源讀取變量

    0

    我想讀取我的配置文件並獲取默認打印機的值。所以在這個例子中,我期望返回結果Zebra_GK420Dbash根據config.ini文件中默認變量的值使用源讀取變量

    我的config.ini文件,如下所示:

    enable_printing=yes 
    default_printer=printer1 
    printer1=Zebra_GK420D 
    printer2=DYMO_LabelWriter_4XL 
    create_proof=yes 
    

    我使用以下bash腳本:

    1 #!/usr/bin/env bash 
        2 
        3 #Define filename 
        4 fConfig=config.ini 
        5 
        6 #If file exists, read in variables. 
        7 if test -f $fConfig ; then 
        8   source $fConfig 
        9 fi 
    10 
    11 echo The default_printer is: ${default_printer%?} 
    12 
    13 echo The name of the default_printer is: $(${default_printer%?}) 
    

    當我運行該腳本,它返回:

    The default_printer is: printer1 
    ./test.sh: line 13: printer1: command not found 
    

    如何我可以修復我的bash腳本,以便它返回以下內容:

    The default_printer is: printer1 
    The name of the default_printer is: Zebra_GK420D 
    

    請注意,由於config.ini文件託管在Windows驅動器上,因此每行最後會返回 ,所以我使用%?刪除每行的最後一個字符。這裏的危險在於文件中的最後一行最後沒有 。我可以使用什麼來代替%?來只刪除 而不是盲目刪除最後一個字符?

    謝謝。

    +1

    如果你修改你的配置文件,以便它不使用DOS行尾,你可以使用間接參數擴展:'$ {!default_printer}'。 (沒有修復它,只需要兩行'tmp = $ {default_printer%?}; echo $ {!tmp}'。) – chepner

    +1

    您可以指定要移除的確切字符:'$ {default_printer%$' r'} '。但是,我強烈建議只修復該文件,而不要讓消費者處理回車。 – chepner

    +1

    你可以嘗試進程替換過濾掉源文件中的回車:'source <(tr -d' r'<$ fConfig)' –

    沙发
    0
    0

    答案出現在錯誤消息中:command not found。看看你的第13行:

    echo The name of the default_printer is: $(${default_printer%?}) 
    

    $(command)在bash中用來獲取命令的輸出。所以你明確地要求將打印機名稱作爲命令執行,並且可以預見,該命令不存在。試試:

    echo The name of the default_printer is: ${default_printer%?} 
    
    0
    votes
    answers
    28 views
    +10

    正確使用帶有未知進程的Bash等待命令編號

    1

    我正在編寫一個bash腳本,該腳本本質上是一個需要大約10個小時才能完成的python腳本,後面跟着一個R腳本,用於檢查python腳本的輸出以獲取所需的任何內容關心。以下是我有:正確使用帶有未知進程的Bash等待命令編號

    ProdRun="python scripts/run_prod.py" 
    
    echo "Commencing Production Run" 
    
    $ProdRun #Runs python script 
    
    wait 
    
    DupCompare="R CMD BATCH --no-save ../dupCompareTD.R" #Runs R script 
    $DupCompare 
    

    現在我的問題是,往往是Python腳本可以根據其輸入,有很多不同的PID的產生我們的Linux服務器上的不同過程的整個堆,我們有工人堆使用相同的服務器啓動腳本。據我所知,「等待」命令必須等待所有進程完成或完成特定的PID,但是當我無法分辨將分配的PID或進程將運行多少個PID時,我該如何確切用它?

    編輯:謝謝你所有的幫助,這是什麼導致我的困境,任何人搜索這個谷歌。我將ProdRun python腳本分解爲它自己調用的單獨腳本,但仍然存在問題,我認爲其中一個腳本也調用了另一個較小的腳本,其末尾有一個「&」忽略在python腳本本身內部等待的任何命令。簡單地刪除它並插入一行「os.system()」,允許所有代碼順序運行。

    +0

    您只能等待子進程。你不能等待孫子的過程。 –

    +0

    不要使用變量來存儲命令;使用功能。 – chepner

    沙发
    0
    1

    這聽起來像是你正試圖實現一個作業調度器,可能在不同的任務之間有一些複雜的依賴關係。我建議使用工作日程安排程序。它允許你指定,同時也像監控功能中獲益跑這些工作,處理異常情況,出錯,...

    的例子是:開源rundeck https://github.com/rundeck/rundeck或商用一體http://www.bmcsoftware.uk/it-solutions/control-m.html

    +0

    感謝您的回覆,對不起,如果我不清楚,我不關心其他進程,只要這個特定的R腳本在python腳本完成後啓動。它是如何工作的,我輸入一個數字作業到python腳本中,並且它爲每個我提交的作業都有一個python進程和它自己的PID。這會落入需要工作調度程序的領域嗎? –

    板凳
    0
    0

    讓你的Python程序等待它產生的孩子。這是解決這種情況的正確方法。然後,在完成之後,您不必等待Python(原文如此)。

    (另外,請勿將您的命令放入變量中。)

    0
    votes
    answers
    46 views
    +10

    grep命令錯誤

    -1

    我已經使用grep命令來過濾列表中的文件。grep命令錯誤

    grep -w -F -f list.txt file1.tsv > file2.tsv

    但它給我一些額外的線條。就像我的列表中有2130個值,而file2中有2213個唯一行。這裏是file1的前幾行。

    Variant   Gene    
        rs1042714  ADRB2     
        rs2297480  FDPS   
        rs12248560  CYP2C19  
    

    以下是List.txt的一些行。

    rs228729 
    rs228642 
    rs228666 
    rs2640909 
    

    我應該用什麼來篩選基於列表文件的文件?

    +2

    的命令是正確的。結果意味着來自* list *的一些值在* file1 * – hek2mgl

    +0

    中出現多次,並在某處添加list.txt和file1.tsv並添加鏈接到您的問題。 – Cyrus

    +0

    沒有值從file1中的列表多次出現,因爲我刪除了重複的值。 – Sarah

    沙发
    0
    0

    的命令是正確的,要檢查你的命令:

    grep -w -F -f list.txt file1.tsv > file2.tsv 
    

    -v執行相同的命令反轉匹配:file2.tsv.invert的

    grep -v -w -F -f list.txt file1.tsv > file2.tsv.invert 
    

    檢查內容

    測試使用的文件(所有結果都OK):

    grep -w -F -f list.txt file2.tsv.invert | wc -l 
    > 0 # it's ok 
    
    wc -l file2.tsv.invert file2.tsv # total must be equal to file1.tsv 
    > 2544 file2.tsv.invert 
    > 2997 file2.tsv 
    > 5541 total 
    
    wc -l file1.tsv 
    > 5541 file1.tsv 
    

    似乎一切OK!

    +0

    file2.tsv和file2.tsv的總行數超過file1.tsv的總數。刪除重複項目後,我完成了總計。當我在excel上同時檢查這兩個文件時,有一些值存在於file2.tsv和file2.tsv.invert中 – Sarah

    +0

    你有DOS文件嗎?嘗試dos2unix來轉換它們,如果你需要。 – Indent

    +0

    嘗試上傳文件 – Indent