能够进入dev my-[tab]我系统上的任何地方并接收自动完成,例如
$ dev my-[tab]
my-project
my-awesome-project
Run Code Online (Sandbox Code Playgroud)
我创建了一个包含/etc/bash_completion.d/以下内容的文件:
_dev()
{
PROJECTS=$(ls /development)
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "${PROJECTS}" -- $cur) )
}
complete -F _dev dev
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但我也希望能够自动完成子文件夹:
[~] $ dev my-p[tab]
[~] $ dev my-project/[tab][tab]
src doc
[~] $ dev my-project/s[tab][enter]
[/development/my-project/src] $
Run Code Online (Sandbox Code Playgroud)
所以基本上,我希望以dev与cd.
dev 只是一个别名:
alias dev='gotodev'
gotodev ()
{
cd /development/$1
}
Run Code Online (Sandbox Code Playgroud) 一般的问题是,我想使用 pexpect 调用需要 sudo 权限的脚本,但我并不总是想输入我的密码(只输入一次)。
我的计划是使用 pexpect 生成具有 sudo 权限的 bash 会话并从那里调用脚本。基本上我总是想让会话保持忙碌,每当一个脚本停止时,我想启动另一个。但是在脚本运行时,我希望用户拥有控制权。意义:
脚本应该在诸如 expect("root@") 之类的之后调用,因此只要会话空闲,它就会启动另一个脚本。当脚本运行时,interact() 让用户控制他想要提供的可能输入。
我的想法是使用不同的线程来解决这个问题。我的代码(用于概念验证)如下所示:
import pexpect
import threading
class BashInteractThread(threading.Thread):
def __init__(self, process):
threading.Thread.__init__(self)
self.pproc = process
def run(self):
self.pproc.interact()
s = pexpect.spawn("/bin/bash", ['-i', '-c', "sudo bash"])
it = BashInteractThread(s)
it.start()
s.expect("root@")
s.sendline("cd ~")
while(s.isalive()):
pass
s.close()
Run Code Online (Sandbox Code Playgroud)
当我调用这个脚本时,它没有给我任何输出,但这个过程似乎已经开始。尽管如此,我还是无法使用 CTRL-C 或 CTRL-D 来终止该进程——我必须单独终止该进程。我期望的行为是提示输入密码,然后它应该自动将目录更改为主目录。我不完全知道为什么它不起作用,但我想输出只会转发到交互()或期望()。
有没有人知道如何解决这个问题?提前致谢。
设置:
为什么 Jest 的 expect 不能将 node.js 的 util.promisify 返回的承诺识别为 Promise 的实例?
以下失败:
const util = require('util');
const fn = util.promisify((opts, cb) => cb(null, {}));
const promise = fn();
expect(promise).toBeInstanceOf(Promise)
Run Code Online (Sandbox Code Playgroud)
同样,以下失败:
const util = require('util');
const fn = util.promisify((opts, cb) => cb(null, {}));
const promise = fn();
expect(promise.then).toBeInstanceOf(Function);
Run Code Online (Sandbox Code Playgroud)
可以通过检查typeof promise.then“功能”来规避这个问题,但我对这种行为的原因很感兴趣。
非常感谢您提供的信息!
我创建了一个命令memo如下:
memo() {
vi $HOME/memo/$1
}
Run Code Online (Sandbox Code Playgroud)
我想将 bash-completion 应用到我memo要打开的目录中的$HOME/memo文件:
$ memo [TAB] # to show files in $HOME/memo
Run Code Online (Sandbox Code Playgroud)
$HOME/memo包含目录,因此列出其下的文件memo是不够的。换句话说,我想将ls命令中使用的内容应用$HOME/memo到memo:
$ ls [TAB]
foo.md bar/
Run Code Online (Sandbox Code Playgroud)
我尝试了以下但它不适用于嵌套目录:
_memo() {
local cur
local files
_get_comp_words_by_ref -n : cur
files=$(ls $MEMODIR)
COMPREPLY=( $(compgen -W "${files}" -- "${cur}") )
}
complete -F _memo memo
Run Code Online (Sandbox Code Playgroud)
MEMODIR=$HOME/memo
请考虑以下 bash 脚本:
#!/bin/bash
touch ./temp
set -C
>./temp &>/dev/null # Visible error message output ("./test7: line 7: ./temp: cannot overwrite existing file")
{ >./temp; } &>/dev/null # No error message
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么由倒数第二行中的重定向导致的错误消息没有被尾随抑制&>/dev/null,而它在最后一行中按预期工作?
我研究了 bash 手册中有关重定向和复合命令的段落(特别是有关组命令的部分),但无法从中做出解释。毕竟,由于花括号中只有一个命令,离开花括号应该不会改变任何东西,不是吗?差异是否与 bash 解析行的顺序有关?
我正在尝试通过 SOCKS5 代理克隆 github 存储库。在~/.ssh/config我有:
Host github.com *.github.com
ProxyCommand /usr/bin/nc -X 5 -x 127.0.0.1:7070 %h %p
Run Code Online (Sandbox Code Playgroud)
git clone失败并出现错误bash: No such file or directory:
$ git clone git@github.com:aureliojargas/sedsed.git
Cloning into 'sedsed'...
bash: No such file or directory
kex_exchange_identification: Connection closed by remote host
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Run Code Online (Sandbox Code Playgroud)
我手动尝试了该ssh命令,但也失败了:
$ ssh -v git@github.com
OpenSSH_8.1p1, LibreSSL 2.7.3
debug1: Reading configuration …Run Code Online (Sandbox Code Playgroud) 我希望有一个无限(或非常大)的超时expect_user和默认超时expect.有没有办法设置不同的超时?或者我只需要在每次使用更改之前手动执行此操作?
我select()用于read()TCP套接字的非阻塞.当select()表示有用于读取数据我不知道我是否还需要处理EINTR后read().
bash 中两个字符串的最长公共前缀sed中的解决方案仅适用于 GNU 。我想要一个更便携的解决方案(例如对于 BSD/macOS 、 Busybox )。sedsedsedsed
我想使用 bash 脚本在 BigQuery 中制作一次性数据集复制,从source_dataset_A到target_dataset_B
这个操作在BigQuery Console中很容易完成,就像这样

但是,如果我bq mk --transfer_config像下面那样使用,它将创建一个具有定期计划(“每 24 小时”)的数据集复制传输作业。
bq mk --transfer_config --project_id=data-project --data_source=cross_region_copy \
--display_name='one-time-dataset-copy' \
--target_dataset=target_dataset_B \
--params='{"source_dataset_id":"source_dataset_A","source_project_id":"source_project","overwrite_destination_table":"true"}' \
Run Code Online (Sandbox Code Playgroud)
如何在 BigQuery 中进行一次性数据集复制?