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 Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 45

0
votes
answers
9 views
+10

需要幫助理解這個俄羅斯方塊的實現

0

我想了解this俄羅斯方塊的實現。需要幫助理解這個俄羅斯方塊的實現

我有幾個問題。

在update_score功能,

if ((score > LEVEL_UP * level)) ; then   # if level should be increased 
    ((level++))         # increment level 
    pkill -SIGUSR1 -f "/bin/bash $0" 

什麼是使用具有在所有的調整延遲一個單獨的進程的?爲什麼使用SIGUSR1SIGUSR2

在draw_piece函數中,爲什麼要乘以8?我不明白轉換是如何發生的,或者如何在這裏實現「輪換」的概念。

for ((i = 0; i < 8; i += 2)) { 
    # relative coordinates are retrieved based on orientation and added to absolute coordinates 
    ((x = $1 + ${piece[$3]:$((i + $4 * 8 + 1)):1} * 2)) 
    ((y = $2 + ${piece[$3]:$((i + $4 * 8)):1})) 
    xyprint $x $y "$5" 

    ... 
} 

我也不理解涉及的語法:here。

在clear_next中,爲什麼需要draw_next ${filled_cell//?/ }而不是${filled_cell}//意味着什麼?

沙发
0
3

我對shell腳本和編程一般初學者,我一直在試圖理解這種實現俄羅斯方塊的[殼]

不知怎的,我懷疑你會發現更容易程序開始。

爲調整延遲有什麼獨立的過程?爲什麼要使用[SIGUSR1]和[SIGUSR2]?

我不認爲有一個爲調整延遲一個單獨的進程,但對於實施計時器。即使程序等待播放器輸入,定時器也必須運行,如果shell函數沒有給出任何超時的方法,那麼必須將其導出到另一個進程。所以,那麼你得到的有在腳本的末尾,一分爲計時器,用戶輸入處理,與實際的遊戲邏輯,產量由前兩個要到最後一個:

(ticker & reader) | (controller) 

bash的read確實有-t標誌超時,所以如果它在Bash中實現,則可能不需要額外的計時器進程。但是,將計時器放在外部進程中也會使其與用戶輸入無關,所以每次用戶點擊按鈕時,都會重置該超時值。解決這個問題需要一些方法來精確確定流逝的時間(或者在read上使用非常短的超時時間並計算滴答時間)。

SIGUSR1SIGUSR2只是「無辜」的信號,對整個系統沒有意義,所以可以在這裏使用它們。當然你也可以使用其他的,但如果他們想停止遊戲,捕捉SIGINTSIGHUP會令用戶惱火。

在draw_piece函數中,爲什麼要乘以8?

((x = $1 + ${piece[$3]:$((i + $4 * 8 + 1)):1} * 2)) 

piece陣列包含不同形狀和碎片的取向。一塊是4個大方塊,每個方塊需要兩個座標,所以我們每塊/方位得到8個數字。因爲,例如,對於S一塊串0001111201101120,所以它有兩個方向:

yx yx yx yx yx yx yx yx 
00 01 11 12 01 10 11 20 

而且一塊看起來是這樣的:

012  012 
0 xx. 0 .x. 
1 .xx 1 xx. 
2 ... 2 x.. 

${variable:position:length}符號從給定挑選一個子變量,所以程序從大字符串中獲取它需要的單個數字。這是一種實現數組的奇怪方式。

在clear_next中,爲什麼需要draw_next ${filled_cell//?/ } ......? //意味着什麼?

${parameter/foo/bar}構造是一種模式替換(參見例如Bash's manual on parameter expansion,查找「替換」)。無論匹配foo的值爲parameter,用bar替換,結果都被展開。用雙斜線替換所有的比賽,只用一個斜線,只有第一個。問號與文件名全局匹配任何字符,這樣可以有效地創建一個與原始字符串一樣長的空格字符串。

例如:

$ str="hallo hallo" 
$ echo "${str/a/e}" 
hello hallo 
$ echo "${str//a/e}" 
hello hello 
$ str="abc" 
$ echo "x${str//?/ }x" 
x x 
+0

謝謝!您能否解釋涉及以下內容的語句的語法:在哪裏嘗試分配座標?這似乎是程序中的一個常見元素,我無法用if-else – Enne

+0

@enne和'$ {::}'來解釋它。子。編輯。 Bash手冊的同一頁面。 – ilkkachu

+0

在單獨的進程中運行定時器沒有多大用處,因爲陷阱處理程序在'read'返回之前未被執行。但我承認除了'bash'以外的其他shell可能會以不同的方式處理。 –

0
votes
answers
8 views
+10

如何確保一個腳本只能在另一個腳本之後運行

2

我有兩個Python腳本作爲cronjobs運行。如何確保一個腳本只能在另一個腳本之後運行

ScriptA處理日誌文件並將記錄插入table,ScriptB使用記錄生成報告。

我已經安排了ScriptA在ScriptB之前一個小時運行,但有時ScriptB在ScriptA完成插入之前運行,從而生成不正確的報告。

如何確保ScriptB在ScriptA完成後立即運行?

編輯 SCRIPTA和ScriptB做完全不同的事情,比如說,一個用於保存用戶數據,另一種是供內部使用。而其他地方可能有一些ScriptC取決於ScriptA。

所以我不能合併這兩個工作。

沙发
0
2

一個辦法是,以確保如果這兩個工作是分開的cron作業 - 有足夠的時間,以其間一定覆蓋作業1.

另一種方法是鎖定的運行,爲他人在這裏建議,但那麼請注意,cron不會因爲鎖定而不能成功完成工作。所以任何一個job2都必須在睡眠週期中運行,直到它不再看到鎖,否則相反會看到一個job 1完成的標誌,否則你將不得不變得富有創造性。

爲什麼不在第一個腳本完成後觸發第2個腳本並將其作爲單個cron作業?

板凳
0
0

讓它寫一個文件,並檢查文件是否存在。

+0

「讓ScriptA寫入文件,然後讓ScriptB定期運行並檢查文件。」你是這個意思嗎? – satoru

+0

是的,正好... – Benjamin

地板
0
0

您可以使用它的方法!有一些控制旗!某處,例如在DB中!

因此,ScriptB只是在該標誌設置後運行!並在它結束後立即將標誌設置回默認狀態!

另一種可以實現該標誌方法的方法是使用文件系統!像@Benjamin建議!

4楼
0
7

做一個運行ScriptA和ScriptB的cron作業不是更好嗎?這樣,您可以確保ScriptB在ScriptA完成之前不會運行,並且不需要修改任何腳本。

的的cronjob可以運行像一個簡單的shell腳本:

#!/bin/sh 

python ScriptA.py 
python ScriptB.py 

編輯:如果你真的不能合併兩個cron作業,你可以用this question描述的技術等待第一過程完成。

+2

打了我幾秒鐘。爲避免創建包裝腳本,cron可以是:* * * */usr/bin/python ScriptA.py &&/usr/bin/python ScriptB.py,其中&&將確保ScriptA完成除RC0以外的任何操作,ScriptB將根本不運行。 – favoretti

0
votes
answers
8 views
+10

不能將文件添加到git commit

1

我在這個論壇嘗試了幾個解決方案,但我不能添加要提交的文件。我使用git add -A,但我的git bash只是凍結。我已經刪除了index.lock文件。似乎每次運行git add -A時都會創建,但沒有任何反應。它只是一個閃爍的光標坐在那裏。我升級了我的git bash,重新初始化了我的項目,但它仍然是同樣的問題。我從下面的線程以及類似的嘗試了多種解決方案:不能將文件添加到git commit

Another git process seems to be running in this repository

完整的錯誤:

Another git process seems to be running in this repository, e.g. an editor opened by 'git commit'. Please make sure all processes are terminated then try again. If it still fails, a git process may have crashed in this repository earlier: remove the file manually to continue.

我使用的是Windows 10,並使用原子是否有幫助。

+0

你提交了多少個文件?你還等多久? – Shadow

沙发
0
1

首先,使用Process Explorer來檢查是否確實有其他git進程仍在運行。

其次,檢查什麼your untracked files(即您要添加到索引)是:

git ls-files --others --exclude-standard 

你可能有太多:調整.gitignore相應。

一旦做到這一點,再試一次,從CMD會話(接近凌動)


正如the comments提到的the OP,這個問題是來自一個名爲「Aux」文件夾中。 。
而且,如在「Why can't we make CON, PRN, Null folder in Windows?」解釋說,不能創建或刪除一個名爲「Aux"文件夾

理想情況下,你會先刪除它:

DEL \.c:path	oAux 

那麼你可以嘗試git add -A再次

+0

這有點幫助。我試着上傳一個React Js項目,所以我不確定你是否熟悉,但是我能夠上傳除包含我的項目文件itsel的文件夾以外的所有內容F。我已經擺脫了我的node_modules文件夾,它顯着減少了文件大小和數量,但仍然有些東西仍然凍結。我的項目文件夾不是特別大,並且其中的文件很少(與我能夠上傳的其他文件夾相比),但我不確定是什麼限制了它?有沒有辦法將它進一步縮小到一個文件或文件夾或某種類型,而不必一個一個去? – user2247061

+0

以及我發現問題文件夾。它的一個文件夾,我無法編輯,由於一些權限錯誤,我無法在Windows中更改它。我試圖刪除文件夾,但它說文件夾太大,但只有一個JavaScript文件,那裏是1kb。我重命名了它,製作了它的一個副本,但權限錯誤仍然阻止我。該文件夾被命名爲「Aux」,並且好像我使用該名稱上的權限立即更改。雖然我還沒有嘗試過改變權限(或最初改變它),當我通過git bash創建這個文件夾。 – user2247061

+0

@ user2247061你可以從CMD會話(而不是bash)中刪除它嗎? – VonC

0
votes
answers
7 views
+10

Bash - 在分開的子文件夾中合併文件

0

因此,我正在尋找一種方法來將多個子文件夾中的.html文件保存在自己的位置。Bash - 在分開的子文件夾中合併文件

實際情況:

$ Folder1 
. 
├── Subfolder1 
│ └── File1.html 
    └── File2.html 
├── Subfolder2 
│ └── File1.html 
    └── File2.html 

期望的結果:

$ Folder1 
. 
├── Subfolder1 
│ └── Mergedfile1.html 
    └── File1.html 
    └── File2.html 
├── Subfolder2 
│ └── Mergedfile2.html 
    └── File1.html 
    └── File2.html 

到目前爲止,我想出了這個:

find . -type f -name *.html -exec cat {} + > Mergedfile.html 

但這種結合了所有的所有文件Folder1子文件夾,而我想讓他們分開。

非常感謝!

+0

我想你想要的是'-maxdepth 1個型D'到你的'find'命令:) –

沙发
0
0

像由AK_說,你可以用找到的exec。

find Folder1/ -mindepth 1 -maxdepth 1 -type d -exec sh -c "rep='{}';cat "'"$rep"'"/*.html > "'"$rep"'"/Mergedfile.html" ; 
+0

你不能使用'{} 「就這樣!這是危險的,並不適用於所有版本的「find」。危險:如果有一個名爲''的文件會發生什麼? rm -rf /#'? POSIX明確指出[如果utility_name或參數字符串包含兩個字符「{}」,但不是兩個字符「{}」,則它是實現定義的,find是否會替換這兩個字符或不改變地使用該字符串。] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html)。所以你使用'{}'是危險的,不正確的。 –

+0

這工作完美! Justed運行另一個命令,以便在戰後再添加子文件夾名稱。非常感謝@ctac_! – Hugo

板凳
0
1

您可以循環在具有for聲明所有子文件夾:

for i in Folder1/SubFolder*; do 
    cat "$i"/File*.html > MergeFile$(echo "$i" | sed 's,.*([0-9]+)$,1,').html 
done 
+0

未加引號的變量將在這有限的情況下工作,但爲了您的代碼在公共角情況下工作,你應該*總是*引用包含帶雙引號的文件名的變量。另請參閱https://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variable – tripleee

+0

你是對的...我編輯我的帖子 – oliv

0
votes
answers
7 views
+10

如何基於不同列中的字??符串grep數據?

0

我有aa.dat具有類似下面的數據,如何基於不同列中的字??符串grep數據?

frame  1 16980 O 17115H 17123H 
FRAME  1 16980 O 16971H 16981H 
frame  1 16982 O 17110H 17121H 
FRAME  1 16982 O 16961H 16978H 
frame  1 16984 O 17124H 17127H 
FRAME  1 16984 O 16983H 16990H 
frame  1 17110 O 17102H 17225H 
FRAME  1 17110 O 16951H 17138H 
FRAME  2 16982 O 16961H 16978H 
frame  2 16984 O 17124H 17127H 
FRAME  2 16984 O 16983H 16990H 
frame  2 17110 O 17102H 17225H 
FRAME  2 17110 O 16951H 17138H 
... 
frame  3 16984 O 17124H 17127H 
FRAME  3 16984 O 16983H 16990H 
frame  3 17110 O 17102H 17225H 
FRAME  3 17110 O 16951H 17138H 
frame  4 16980 O 17115H 17123H 
FRAME  4 16980 O 16971H 16981H 
frame  4 16982 O 17110H 17121H 
FRAME  4 16982 O 16961H 16978H 
frame  4 17110 Ac 17102H 17225H 
FRAME  4 17110 Ac 16952H 17118H 
... 

我想以「幀」和「17110」的數據只在第3列

FRAME  1 17110 O 16951H 17138H 
FRAME  2 17110 O 16951H 17138H 
FRAME  3 17110 O 16951H 17138H 
FRAME  4 17110 Ac 16952H 17118H 
... 

然而,我的代碼

grep -E 'FRAME.*17110' aa.dat 

無法從17110H組成的行中分離數據。

任何建議和幫助將不勝感激。

最佳,

萊昂

沙发
0
0
grep -P 'FRAME.*17110W' aa.dat 

簡要說明,

  • -P:解釋圖案作爲一個Perl正則表達式
  • 追加W將僅允許非字(即[^a-zA-Z_])
0
votes
answers
7 views
+10

Git Bash Windows:管道輸出ls -t | head -n 3到cp

1

我想使用Git Bash將我最近下載的3個文件複製到另一個目錄。我可以用Git Bash Windows:管道輸出ls -t | head -n 3到cp

ls -t ~/Downloads|head -n 3

一一列舉了,但我怎麼將它們作爲輸入到CP的功能,這樣我可以 將它們拷貝到其他目錄?

我很新的編程和Bash,所以我很抱歉,如果這是顯而易見的。

+2

這與git無關,實際上只是一個bash問題。你在找什麼是xargs。 –

沙发
0
1

注意:你不需要的Git的bash複製這些文件:如果你已經添加<git>/usr/bin%PATH%(如I do here, with this simplified PATH),你可以在任何常規CMD會議Linux命令序列:

[email protected] D:gitgit 
> where xargs 
D:prgsgitlatestusrinxargs.exe 

[email protected] D:gitgit 
> ls -t|head -3|xargs | xargs -I{} echo "{}" a 
wt-status.h wt-status.c worktree.h a 

另請參閱「pass output as an argument for cp in bash」,其中提到了xargs。
其他選項(cp $(ls -t | head -3) Directory)必須只在bash中。

+0

謝謝你的回覆! –

+0

@RawNoob當然。不要忘記閱讀https://stackoverflow.com/help/someone-answers – VonC

0
votes
answers
7 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

0
votes
answers
6 views
+10

shell腳本重新啓動屏幕內的django runserver

0

如何使用shell腳本重新啓動django runserver?我在屏幕上運行了django服務器。shell腳本重新啓動屏幕內的django runserver

這是我的shell腳本restartpython.sh:

killall -9 python 
screen -r 
sleep 5 
exec python manage.py runserver 0.0.0.0:8000 
ctrl+a d   # how to make this into shell script?? 

當我執行這個腳本,我進入屏幕和蟒蛇服務器被殺害。但劇本沒有跑這條線:

exec python manage.py runserver 0.0.0.0:8000 

它顯示了這個錯誤:

python: can't open file 'manage.py': [Errno 2] No such file or directory 

此外,如何運行CTRL +(從屏幕退出)在shell腳本中的d?謝謝。

+0

這聽起來像是一個黑客一起僞生產配置。 ['runserver'不能用於生產](https://docs.djangoproject.com/en/1.10/ref/django-admin/#runserver)。你想做什麼? – Chris

+0

@Chris我試圖做一個腳本來重新啓動django runserver。因爲,Django runserver有時會卡住。我現在仍處於開發階段。我會用其他方法來製作。 – Krisnadi

+0

通常我只是運行'python manage.py'並讓它在一個開放的終端窗口中運行。有沒有什麼特別的原因可以通過在屏幕上添加'screen'和一個自定義的shell腳本來使事情複雜化? (請注意,'killall -9 python'幾乎肯定不是應該在那裏的東西,而且你可能不需要'exec'或者......) – Chris

沙发
0
0

而不是運行服務器,使用gunicornkill -HUP重新加載您的服務器。

+0

這意味着放棄開發服務器的自動重新加載功能... – Chris

+0

請參閱http://superuser.com/questions/181517/how-to-execute-a-command-whenever-a-file-changes – Udi

0
votes
answers
6 views
+10

grep啓動後臺進程

0

我有一個輸入文件,其中包含幾個路徑,其中一個引用初始解決方案。相應的線路如下:grep啓動後臺進程

initial_solution_file = ../../INIT/foo 

我想要做的是有這樣我就輸入「初始化」和外殼將返回,將顯示此路徑的別名「最初的解決方案是:../ ../INIT/foo」

我曾嘗試是:

grep initial_solution_file input_file | awk '{print $3}' | echo "the initial solution is:" `xargs echo` 

它提供了所需的輸出,但我additionaly得到的東西,如: [6] 48201 48202

這是什麼以及如何防止它發生?

在此先感謝

+0

嘗試在'grep'前添加'command'。像'command grep initial_solution_file input_file ...' – NullDev

沙发
0
0
echo "the initial solution is: $(awk '/initial_solution_file/{print $3}' input_file)" 
the initial solution is: ../../INIT/foo 

沒有必要管,可以使用$(....)結構做命令替換。另外,grepawk可以單獨由awk完成。

+0

感謝它確實在bash =) 工作但它返回「非法變量名稱。」在tcsh中。任何方式在tcsh中做到這一點? – EdouardIFP

+0

我正確地將它複製到我從tcsh執行的bash腳本中。 這可能是最乾淨的方法,但它的工作原理。 – EdouardIFP

0
votes
answers
6 views
+10

殺死舊的(如果存在)啓動新進程

1

我有一個shell腳本,我需要經常啓動。我可以設置啓動快捷方式(我用它來啓動),但不能終止。我需要Ctrl + C來終止它。結果有時最終會打開許多??流程。殺死舊的(如果存在)啓動新進程

所以我想要做的是在腳本中添加一些命令,檢查腳本中是否存在較舊的進程並殺死它然後啓動新的進程。

只是爲了讓我的要求更加明確,我嘗試以下

說行書是/home/user/runscript.sh
ps aux | grep runscript.sh給我

user+ 6135 0.0 0.0 16620 1492 ?  S 18:28 0:00 /home/user/runscript.sh 
user+ 6208 0.0 0.0 15936 952 pts/6 R+ 18:28 0:00 grep --color=auto runscript.sh 

我在前面加上劇本

pkill -f runscript.sh 

下殺過程中,如果它已經在運行。它解決了殺死舊流程的目的,但沒有讓新流程開始。原因很明顯,後來我明白了。

這樣做的正確方法是什麼?

沙发
0
7

的典型方法這是使用基於文件系統的鎖定策略:

的腳本創建一個鎖定文件(/var/lock/subsystem/...)有自己的進程號爲內容。啓動時,它第一個檢查這個文件是否已經存在。如果不是,一切都好。但如果是這樣,那麼它會從文件中讀取進程號並使用它來檢查進程表。如果這樣的過程仍然存在,那麼它可以退出(通常的行爲),或者可以通過發送SIG-TERM信號來終止該過程(你要求的)。

+0

感謝您的詳細解釋。我可以想到這樣的行爲,但想知道是否存在可以做到這一點的一些命令或單行命令組合。 –

+0

這確實是要走的路。我建議你進一步閱讀[ProcessManagement](http://mywiki.wooledge.org/ProcessManagement) –

板凳
0
2

您可以改爲使用killall。麻煩的是,你想避免殺死你的當前進程,但是這很容易與-o標誌位來完成:

-o,--older高於

僅匹配是老年人(開始前)的過程指定的時間爲 。時間被指定爲浮動然後是單位。 單位分別是s,m,h,d,w,M,y,分別爲秒,分鐘,小時,天, 周,月和年。

因此,這應該工作:

killall -o 5s runscript.sh 

對方回答是從根本上更好,因爲它是彈性的「專業」的做法,但如果只是爲了自己的腳本這個方法應該工作,你想採取簡單的方法。

+0

這可以基於PID來完成嗎?最好使其與時間無關。儘管您的解決方案足以滿足我的要求。 –

+0

這裏的一個問題是,您需要確切地知道_how_進程已啓動,因爲'killall'工作名稱(路徑)基於。 – arkascha

+0

該進程始終直接使用該命令啓動。 –