我有一个生成motd的bash脚本.问题取决于一些终端设置,我不确定颜色是否会延伸到行尾.Othertimes它没有:
例如

VS

IIRC只是正常的gnome-terminal,另一个是我的tmux术语.所以我的问题是如何将其扩展到80个字符(或者真正的终端宽度).当然我可以填充到80个字符,但这确实无法解决问题.
这是我的代码片段,它产生了motd:
TC_RESET="^[[0m"
TC_SKY="^[[0;37;44m"
TC_GRD="^[[0;30;42m"
TC_TEXT="^[[38;5;203m"
echo -n "${TC_SKY}
... lots of printing..."
echo -e "\n Welcome to Mokon's Linux! \n"
echo -n "${TC_GRD}"
nodeinfo # Just prints the info seen below...
echo ${TC_RESET}
Run Code Online (Sandbox Code Playgroud)
如何以编程方式从bash更改终端设置或某些内容将颜色更改为行尾?
考虑以下两个宏:
#define PNORM( v, s, ... ) { \
if( VERBOSITY_CHECK( v ) ) { \
if( ( errno = pthread_mutex_lock(&server.output_mutex) ) ) { \
PERROR_LOCKFREE( normal, "\tpthread_mutex_lock failed on output_mutex.\r\n" ) ; \
} \
fprintf( stdout, s, ## __VA_ARGS__ ) ; \
fflush( stdout ) ; \
if( ( errno = pthread_mutex_unlock(&server.output_mutex) ) ) { \
PERROR_LOCKFREE( normal, "\tpthread_mutex_unlock failed on output_mutex.\r\n" ) ; \
} \
} \
}
#define PERROR_LOCKFREE( v, s, ... ) { \ …Run Code Online (Sandbox Code Playgroud) 所以我正在尝试向NSS(名称服务交换机)添加服务.请注意GNU指南,了解如何在此处执行此操作.我一直在关注那个指南.我需要实现一个与passwd数据库一起使用的服务.
我遇到的问题是我的模块没有被调用某些功能.让我在这里重现一些代码......
enum nss_status
_nss_myservice_setpwent (void) {
printf( "@ %s\n", __FUNCTION__ ) ;
return NSS_STATUS_SUCCESS ;
} ;
enum nss_status
_nss_myservice_endpwent (void) {
printf( "@ %s\n", __FUNCTION__ ) ;
return NSS_STATUS_SUCCESS ;
} ;
enum nss_status
_nss_myservice_getpwent_r (struct passwd *result, char *buffer,
size_t buflen, int *errnop) {
static int i = 0 ;
if( i++ == 0 ) {
printf( "@ %s\n", __FUNCTION__ ) ;
return init_result( result, buffer, buflen, errnop ) ;
} else { …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个简单的vim脚本函数,我遇到了麻烦.此函数需要获取两个输入字符串并运行搜索并替换它们的所有实例.我现在有以下内容:
function! FindAndReplaceAll(from, to)
echo a:from
:%s/a:from/a:to/gc
endfunction
Run Code Online (Sandbox Code Playgroud)
当我做:
:call FindAndReplaceAll("test", "test2")
Run Code Online (Sandbox Code Playgroud)
echo a:from正常工作但是:%s ...代替了from和to literals.我注意到我的vim语法高亮度甚至没有突出显示那些变量,所以我似乎有一个基本的语法问题.
我的问题是:
无论如何,允许将其称为
:调用FindAndReplaceAll(test,test2)
所以我不必添加引号......
所以我想创建一个可移植的bashrc/bash_profile文件.我有一个单独的脚本,我象征性地链接到.bashrc,.bash_profile等.然后$0我看着根据调用的脚本切换我做的事情.问题是shell调用bashrc脚本当然它执行bash真的$0对我来说意味着什么-bash.$1更多未设置为脚本名称.
所以我的问题是,在bash中如何获取正在执行的脚本的名称.不是执行它的二进制文件,例如bash?
我认为它给了我-bash与$1未设置,因为这实在不是一个新的进程.有任何想法吗?
所以我有一个相当可观的程序,它偶尔会冻结。
该程序使用 Qt、开放场景图和谷歌日志记录。这种冻结发生在谷歌日志中的打印过程中。程序本身正在打印大量调试信息。我能够通过 gdb-server 连接到程序,这是堆栈跟踪:
#0 0x000000397ac0e030 in __write_nocancel () at ../sysdeps/unix/syscall-template.S:82
#1 0x00007f5eecb74aeb in google::LogMessage::SendToLog() () from /lib64/libglog.so.0
#2 0x00007f5eecb71fc7 in google::LogMessage::Flush() () from /lib64/libglog.so.0
#3 0x00007f5eecb721a9 in google::LogMessage::~LogMessage() () from /lib64/libglog.so.0
#4 0x00000000004874a6 in LSDB::process (this=0x242d918, lsp=0x25f9200, circuit=0x24c7af0) at ../src/model/trill/LSDB.cpp:481
#5 0x00000000004a0f6f in Circuit::rx (this=0x24c7af0, eth=0x246fdf0) at ../src/model/trill/Circuit.cpp:355
#6 0x000000000045c950 in Circuit::qt_static_metacall (_o=0x24c7af0, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7fffaade95a0)
at ../src/model/trill/Circuit.moc.cpp:55
#7 0x000000398798cb9f in QMetaObject::activate (sender=0x2470140, m=<optimized out>, local_signal_index=<optimized out>, argv=0x7fffaade95a0)
at kernel/qobject.cpp:3547
#8 0x0000000000459610 in FramePublisher::subscription (this=0x2470140, _t1=0x246fdf0) at ../src/model/system/FramePublisher.moc.cpp:98 …Run Code Online (Sandbox Code Playgroud) 我试图了解sudo如何在Linux用户区和Linux内核中运行.从用户的角度来看,我对它并不是那么感兴趣,但我更感兴趣的是从实现/内核的角度来理解它.(我已经讨论过将它放在stackexchange和超级用户之间,但我认为这将是最好的.如果我做出了错误的选择,请随意移动它...)
因此,当内核完成引导时,它会启动init进程,该进程当然具有0的uid.然后可以启动其他进程,例如ssh守护进程.这个新进程继承了其父进程的uid,例如0. sshd现在也启动子进程,每个进程一个.然后完成对尝试登录的用户的身份验证,无论是通过passwd文件,影子文件,pam等.一旦sshd通过它使用的任何方法验证用户,它就会调用setuid/seteuid来更改进程UID.现在我的理解是一个程序只能从root到另一个用户而不是从用户x到root或者用户x到用户y(这是正确的吗?)(使用setuid调用?)
因此,在这方面,内核实际上只知道分配给文件,进程等的uid.用户帐户中的身份验证在用户空间中受到控制,并且通过仅允许根程序进入非根程序来保护.
所以我的问题是,如果以上是正确的,那么sudo是如何工作的.当前运行我的非root帐户的终端如何临时切换到root权限?它是否与sudo进程交互?如果以上是错误的,即使是一点点,我也想知道我错在哪里.
我正在开发一个程序,它使用autotools构建系统并在linux上编译好.为windows构建我正试图让一个mingw交叉编译器为windows工作.现在,当我在linux上编译并移动到窗口时,我当然缺少一些默认情况下未安装在Windows上的dll.这导致dll错误丢失.由于LGPL的限制,我无法静态链接我的程序.
所以我的问题是在这种情况下交叉编译的正确方法是什么?我觉得我需要将我的exe包装在一个安装程序中,该安装程序会自动解析并安装windows的dll依赖项,但我无法找到解释如何执行此操作的内容.基本上我在考虑使用yum/apt-get for windows.如何在Windows上管理dll依赖项?我是一个Linux家伙,不是Windows家伙,所以请耐心等待.
我想在我的vimrc风格中做一些非常简单的事情.如下所示,我试图将两个环境变量连接到一个局部变量,然后使用该变量.
let cs=$menv_dotfiles_dir."/vimrc_style/".${CODING_STYLE}.".vim"
if filereadable(cs)
source cs
endif
Run Code Online (Sandbox Code Playgroud)
当然上面的方法不起作用,但我认为它表达了我需要做的事情.这样做的正确方法是什么?
与此类似:Vim:基于字符串的源代码但我只有在文件存在时才需要这样做.
所以我有以下代码可行:
my $cmp;
if ( $action eq DEL ) {
$cmp = \&cmpb;
}
else {
$cmp = \&cmpf;
}
foreach my $x ( sort $cmp keys %y ) {
# do something
}
Run Code Online (Sandbox Code Playgroud)
这里的cmpb和cmpf是:
sub cmpf { $a cmp $b }
sub cmpb { $b cmp $a }
Run Code Online (Sandbox Code Playgroud)
现在我的问题是我宁愿做类似的事情:
foreach my $x ( sort $action eq DEL ? \&cmpb : \&cmpf keys %y ) {
# do something
}
Run Code Online (Sandbox Code Playgroud)
甚至更好:
foreach my $x ( sort $action eq DEL ? …Run Code Online (Sandbox Code Playgroud)