2015-06-25 55 views
0

我寫了大量的bash/zsh/nodejs腳本,並且希望允許一個選項以基於終端的形式交互式地指定一些選項。如何在終端中實現表單?

因此,例如,說我運行一個程序,像這樣:

foo -name=test -dir=/tmp -output=tmp/it.txt 

我想能夠顯示的形式,有這些選項爲默認值,並有可能在列表中還有其他的值是我可以選擇。

有沒有辦法做到這一點已經存在?

我認爲這將會是巨大的,如果我可以指定一些JSON的選項,然後將它們傳遞到後開始了我的程序的程序,

例如,使用JSON像這樣在一個名爲args.json文件

{ 
    "program": "foo", 
    "args": { 
     "name": "test", 
     "dir": "/tmp", 
     "output": "tmp/it.txt" 
    } 
} 

我可以運行

form_runner args.json 

,它會顯示讓我填寫交互的形式在終端的形式,並通過打enter,它會運行該程序。

+2

你有沒有試過祝福? https://github.com/chjj/blessed – ymonad

+0

爲什麼不寫一個?我想這不會花太長時間。 – ShellFish

+1

你看過[對話框](http://linux.die.net/man/1/dialog)嗎? –

回答

3

如果您想要在純nodejs中執行此操作,那麼使用https://github.com/chjj/blessed將很容易。

如果你想用bash做,dialogzenity(需要X)將是選項。

下面是使用祝福的示例程序。您可以使用npm install blessednode the_script.js args.json來運行它。

var blessed = require('blessed'), fs = require('fs'), child_process = require('child_process'); 

const TITLE_PROG="program:"; 

fs.readFile(process.argv[2], function(err,data){ 
    var js = JSON.parse(data) 
    var screen = blessed.screen({ 
    autoPadding: true, 
    smartCSR: true 
    }); 
    var form = blessed.form({ 
    parent: screen, 
    width: 60, 
    height: 4, 
    keys: true 
    }); 
    blessed.text({ 
    parent: form, 
    fg: 'cyan', 
    content: TITLE_PROG 
    }) 
    var prog = blessed.textbox({ 
    parent: form, 
    name:'program', 
    inputOnFocus: true, 
    value: js['program'], 
    left: TITLE_PROG.length + 1 
    }) 
    var texts = Object.keys(js['args']).forEach(function(key,index){ 
    blessed.text({ 
     parent: form, 
     top: index + 1, 
     content: key + ':', 
     fg:'green' 
    }) 
    blessed.textbox({ 
     parent: form, 
     inputOnFocus: true, 
     name: key, 
     value: js['args'][key], 
     top: index + 1, 
     left: key.length + 2 
    }) 
    }) 

    form.on('submit', function(data){ 
    screen.leave(); 
    var prog = data['program'] 
    delete data['program'] 
    var cmd = prog + ' ' + Object.keys(data).map(function(key){return '-' + key + ' "' + data[key] + '"'}).join(' ') 
    child_process.exec(cmd,function(error,stdout,stderr){ 
     screen.leave(); 
     console.log('stdout: ' + stdout) 
     console.log('stderr: ' + stderr) 
     if(error !== null){ 
     console.log('error: ' + error) 
     process.exit(error.code); 
     } 
     process.exit(0); 
    }) 
    }) 
    screen.key(['enter'], function(){ 
    form.submit(); 
    }); 

    screen.key(['escape','C-c'], function(){ 
    screen.leave(); 
    process.exit(0); 
    }); 

    prog.focus() 

    screen.render(); 

}) 
+0

太棒了!謝謝你的努力,因爲這是岩石! –