读取 CLI Dart 应用程序的 'hidden' 个输入
Read 'hidden' input for CLI Dart app
从命令行 Dart 应用程序接收 'hidden' 输入的最佳方式是什么?例如,在 Bash 中,这是通过以下方式完成的:
read -s SOME_VAR
将io.stdin.echoMode
设为假:
import 'dart:io' as io;
void main() {
io.stdin.echoMode = false;
String input = io.stdin.readLineSync();
// or
var input;
while(input != 32) {
input = io.stdin.readByteSync();
if(input != 10) print(input);
}
// restore echoMode
io.stdin.echoMode = true;
}
这是一个稍微扩展的版本,主要区别在于它使用 finally 块来确保在代码执行时抛出异常时重置模式。
该代码还使用 waitFor 调用(仅在 dart cli 应用程序中可用)将此代码转换为同步调用。鉴于这是一个 cli 命令,因此不需要 futures 给 table.
带来的复杂性
该代码还会在您键入时执行经典输出“*”。
如果您经常使用 cli,下面的代码来自我正在开发的名为 dcli 的 dart 包。看看 'ask' 方法。
String readHidden() {
var line = <int>[];
try {
stdin.echoMode = false;
stdin.lineMode = false;
int char;
do {
char = stdin.readByteSync();
if (char != 10) {
stdout.write('*');
// we must wait for flush as only one flush can be outstanding at a time.
waitFor<void>(stdout.flush());
line.add(char);
}
} while (char != 10);
} finally {
stdin.echoMode = true;
stdin.lineMode = true;
}
// output a newline as we have suppressed it.
print('');
return Encoding.getByName('utf-8').decode(line);
}
从命令行 Dart 应用程序接收 'hidden' 输入的最佳方式是什么?例如,在 Bash 中,这是通过以下方式完成的:
read -s SOME_VAR
将io.stdin.echoMode
设为假:
import 'dart:io' as io;
void main() {
io.stdin.echoMode = false;
String input = io.stdin.readLineSync();
// or
var input;
while(input != 32) {
input = io.stdin.readByteSync();
if(input != 10) print(input);
}
// restore echoMode
io.stdin.echoMode = true;
}
这是一个稍微扩展的版本,主要区别在于它使用 finally 块来确保在代码执行时抛出异常时重置模式。 该代码还使用 waitFor 调用(仅在 dart cli 应用程序中可用)将此代码转换为同步调用。鉴于这是一个 cli 命令,因此不需要 futures 给 table.
带来的复杂性该代码还会在您键入时执行经典输出“*”。
如果您经常使用 cli,下面的代码来自我正在开发的名为 dcli 的 dart 包。看看 'ask' 方法。
String readHidden() {
var line = <int>[];
try {
stdin.echoMode = false;
stdin.lineMode = false;
int char;
do {
char = stdin.readByteSync();
if (char != 10) {
stdout.write('*');
// we must wait for flush as only one flush can be outstanding at a time.
waitFor<void>(stdout.flush());
line.add(char);
}
} while (char != 10);
} finally {
stdin.echoMode = true;
stdin.lineMode = true;
}
// output a newline as we have suppressed it.
print('');
return Encoding.getByName('utf-8').decode(line);
}