2014-07-21 14 views
6

Làm thế nào tôi có thể nhận được các đối số dòng lệnh thô trong một ứng dụng Node.js, cho ví dụ lệnh này:nhận đối số dòng lệnh thô trong Node.js

node forwardwithssh.js echo "hello arguments"

process.argv sẽ [ "node", "/path/to/forwardwith.js", "echo", "hello arguments" ]

Và không có cách nào để xây dựng lại echo "hello arguments" gốc từ đó (ví dụ: join(" " sẽ không đặt lại dấu ngoặc kép). Tôi muốn toàn bộ chuỗi gốc ban đầu sau tên tập lệnh.

những gì tôi muốn có thể dễ dàng có được trong các tập lệnh bash với "$*", có cách nào tương đương để nhận điều đó trong node.js không?

Lưu ý: mục đích đặc biệt là để nhận được một lệnh được thực hiện ở một nơi khác

+0

Mô-đun này sẽ có thể thực hiện những gì bạn muốn: https://www.npmjs.org/package/minimist –

+0

Không có cách nào để cho biết đối số ban đầu đã được chỉ định là '" đối số chào "", ''hay không hello arguments'' hoặc 'hello \ argument'. Đó là tất cả như nhau trong bash. Bạn có muốn luôn luôn giả định rằng một arg với một không gian ban đầu được trích dẫn với dấu ngoặc kép? Thật dễ dàng để thấy rằng không gian phải được thoát bằng cách nào đó, bởi vì bạn nhận được một arg thay vì hai cho "chào đối số". – Paulpro

+0

Bạn có thể báo giá tất cả args 'process.argv.map (hàm (arg) {return '"' + arg + '"';});'. Nó sẽ cung cấp cho bạn: '" node "" forwardwithssh.js "" echo "" hello arguments "', cũng giống như bash như lệnh ban đầu của bạn. – Paulpro

Trả lời

3

Bọc mỗi args trong dấu ngoặc kép duy nhất, và trốn thoát và dấu nháy đơn trong mỗi arg để '\'' (ví dụ qua ssh.):

var cmd_string = process.argv.map(function(arg){ 
    return "'" + arg.replace(/'/g, "'\\''") + "'"; 
}).join(' '); 

Điều đó sẽ cung cấp cho bạn một cmd_string chứa:

'node' '/path/to/forwardwith.js' 'echo' 'hello arguments' 

mà có thể chạy trực tiếp trong vỏ khác.

+0

Tôi sợ thêm dấu nháy đơn sẽ không hoạt động trên trình bao, nhưng bạn nói đúng, tôi muốn bây giờ phải đối phó với thoát, và có thể đăng nhập lệnh gốc ... nhưng điều này có vẻ là giải pháp tốt nhất có sẵn – Benja

+0

Nó không đưa ra các đối số lệnh gốc. 'nút x.js y' và 'nút x.js "y"' sẽ cho cùng một process.argv. – wandalen

+0

@wandalen Những thứ được đánh giá giống hệt nhau trong một trình bao trước khi 'nút' được gọi ngay cả. Nếu bạn muốn chuyển dấu ngoặc kép từ một trình bao, bạn sẽ cần 'nút x.js \ 'y \'' hoặc 'nút x.js" 'y' "'. – Paulpro

Các vấn đề liên quan