在现代 Linux shell 中,许多命令(如ls)可以输出彩色文本。
如果你用其他命令管道它,你会失去颜色。例如:
$ ls path
[... folders in blue, executables in green,..etc ]
$ ls path | grep foo
[... all in black and white]
Run Code Online (Sandbox Code Playgroud)
如何使grep管道的第二部分尊重ls颜色(或执行的任何其他命令)?
我正在尝试在工作的计算机上更改 Cygwin 的主目录。默认情况下,我们的主目录映射到网络共享。这似乎给 Cygwin 造成了一些混乱,因为它在我的桌面上创建了一个目录,该目录遵循与网络共享相同的路径,还有一些其他前缀基于我打开 cygwin 的位置。
如果我从安装时创建的默认快捷方式打开 Cygwin:
$ echo $HOME
/cygdrive/c/Users/shaun/Desktop/SERVER/USERS:USERS/SHAUN
Run Code Online (Sandbox Code Playgroud)
如果我从 PowerShell 打开 Cygwin:
$ echo $HOME
/usr/bin/SERVER/USERS:USERS/SHAUN
Run Code Online (Sandbox Code Playgroud)
我宁愿将我的主目录放在我为自己管理程序而设置的本地程序目录中。像这样:
/cygdrive/c/users/shaun/apps/cygwin/home/shaun
Run Code Online (Sandbox Code Playgroud)
按照cygwin 的建议,执行此操作的首选方法是在/etc/nsswitch.conf. 这看起来应该这样做:
db_home: unix /%H/Apps/cygwin/home/shaun
Run Code Online (Sandbox Code Playgroud)
我对此文件所做的任何更改似乎都被忽略了。我重新启动了终端,即使我故意弄乱了语法,我也没有发现任何错误。我尝试过但失败的一些选项:
db_home: /cygdrive/c/users/shaun/apps/cygwin/home/shaun
db_home: /%H/Apps/cygwin/home/shaun
db_home: unix /%H/Apps/cygwin/home/shaun
db_home: cygwin desc
db_home: cygwin /path /%H/Apps/cygwin/home/shaun
Run Code Online (Sandbox Code Playgroud)
每次尝试后我都重新启动了 Cygwin 进程。我也尝试将db_shell选项更改为/bin/sh仅作为实验,但外壳没有改变。
StackExchange 中过去的问题建议更改/etc/passwd文件,只有在注释掉/etc/profile自动创建 HOME 目录的代码块后,我才能使其工作。然后,过了一段时间,它又回到了原来的家。
我对/etc/nsswitch.conf文件有什么遗漏吗?这似乎是设置自定义配置的一种简单方便的方法。替代方案似乎是 Cygwin 不推荐的过时黑客,但如果我错了,请告诉我哪种方法更受欢迎。
我的电流 /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# This file is read once by …Run Code Online (Sandbox Code Playgroud) 我有一个脚本
#!/bin/sh
# Automatically remove a torrent and delete its data after a specified period of
# time (in seconds).
TARGET=/var/www/transmission/completed
USER=name
PASS=pass
BIN="/usr/bin/transmission-remote"
# The default is 5 minutes (in seconds).
CUTOFF=`expr 100 \* 3`
##############################################
### You shouldn't need to edit below here. ###
##############################################
# Tokenise over newlines instead of spaces.
OLDIFS=$IFS
IFS="
"
for ENTRY in `$BIN -n $USER:$PASS -l | grep 100%.*Done.*Finished`; do
# Pull the ID out of the listing.
ID=`echo $ENTRY | sed …Run Code Online (Sandbox Code Playgroud) rsync是一个登录到其他机器的非交互式程序。它不需要用于交互式 shell 会话的 init 文件,并且绝对需要用于登录 shell 的 init 文件。或者我会这么认为。
然而.bashrc被阅读.profile却没有(除非我让.bashrc自己阅读.profile)。为什么?
我的最终目标是在我的 Windows 7 机器中拥有一个带有 Unix 命令(例如ls代替dir)、颜色和工作键的终端。我目前尝试在 Console2 中使用 Git Bash。我创建了一个新标签:
Title: Git Bash
Icon: C:\Program Files\Git\mingw64\share\git\git-for-windows.ico
Shell: C:\Windows\System32\cmd.exe /C "C:\Program Files\Git\bin\bash.exe" --login -i
Startup dir: C:\Users\evesforeva
Run Code Online (Sandbox Code Playgroud)
Git Bash 给了我 Unix 命令。添加 ansicon 给了我颜色。但是当我输入Ctrl+ 时C,它会关闭整个选项卡。我需要它来停止进程,就像rails server不关闭选项卡一样。我也试过交换的不同组合,C:\Windows\System32\cmd.exe对C:\Windows\SysWOW64\cmd.exe与C:\Program Files\Git\bin\bash.exe对C:\Program Files\Git\bin\sh.exe,并得到了相同的结果。
非常感谢该问题的直接解决方案,但如果这不可能,我将采用任何提供 Unix 命令、颜色和工作键的东西。我也尝试过直接将 Git Bash 与 minTTY 一起使用,但箭头键不起作用并irb在一个命令后退出。我什至尝试安装 Ubuntu。我的 HP Probook 650 G1 不允许我更改任何 BOIS 设置,因此双引导和 VirtualBox 都不起作用。
在 Console2 中运行 Git Bash …
我有一堆文件,其中有很多行配置如下:
what,r-crq,What,What,VAC5700-035080,What
i,pns11,I,I,VAC5700-035090,I
do,vdd,did,did,VAC5700-035100,did
Run Code Online (Sandbox Code Playgroud)
我想进行搜索和替换以结束此操作,然后存储并重新插入 4 个数字VAC并删除数字的尾随部分VAC:
what,r-crq,What,What,VAC5700,What
i,pns11,I,I,VAC5700,I
do,vdd,did,did,VAC5700,did
Run Code Online (Sandbox Code Playgroud)
有没有办法一次对所有文件执行此操作(VAC数量会有所不同,因此需要将其存储为变量),最好是在 Bash shell 中?
我假设我也可以使用正则表达式在“Notepad++”中执行此操作,但我认为 shell 脚本会更可取,因为我可以将所有文件作为批处理执行。
在使用“make 2>&1”编译一些程序后,我想在less命令中保留颜色。“grep”和“ls”命令有类似的主题,但解决方案不适用于此命令。
例如,
make 2>&1 | less -R
Run Code Online (Sandbox Code Playgroud)
不起作用。
谢谢你的帮助。
考虑以下文本文件
one 1
two 2
three 3
four 4
five 5
six 6
seven 7
eight 8
Run Code Online (Sandbox Code Playgroud)
我想访问匹配后的第二行four。这将是这条线
six 6
Run Code Online (Sandbox Code Playgroud)
然后将生成的行(因此上面的行)通过管道进行进一步处理(例如 a | cut -d' ' -f2)。
有没有办法在 bash 和其他典型实用程序中做到这一点?(否则我会用 Python 编写它)
编辑:在我的特定情况下,four(以该示例为例)的发生保证是唯一的。但是答案显示了有趣的扩展案例,而事实并非如此。
鉴于以下测试脚本:
#!/bin/bash
# see "killing timeout": https://unix.stackexchange.com/a/57692/65781
declare -a timeout_pids
my_timeout(){
local args tp
args="$@"
timeout $args &
tp=$!
#echo "pid of timeout: $tp"
timeout_pids+=($tp)
wait $tp
}
cleanup(){
echo "-----------------------------------------"
echo "Restoring previous routing table settings"
}
pre_cleanup(){
echo "Executing pre-cleanup..."
exit
}
trap pre_cleanup INT
trap cleanup EXIT
echo "ctrl+c now to execute cleanup"
#my_timeout 9s sleep 20 2> /dev/null >/dev/null # <- does not work as expected!
my_timeout 9s sleep 20 2> /dev/null # <- works as …Run Code Online (Sandbox Code Playgroud) 我想重新启动我的 zsh 会话,因为我保留了一个持久的 tmux 会话并且~/.zshrc经常更改并执行source ~/.zshrc. 但是我意识到随着时间的推移这会变慢(例如for i inseq 50; do source ~/.zshrc; echo "a"; done开始快速打印 'a' 并且很快变慢)。
我在这里阅读了重新启动 zsh 的建议,建议只需运行zsh或zsh -l. 但是,如果我这样做,我会创建一个“嵌套”zsh 会话,如果我理解正确的话。我的意思是:
# Simulate slowed zsh session
for i in `seq 50`; do source ~/.zshrc; echo "a"; done
# use zsh to make it faster "child" zsh
zsh
# confirm fast
source ~/.zshrc; # fast
# revert back to "parent" zsh
exit
# confirm old slow …Run Code Online (Sandbox Code Playgroud)