使用GNU date命令行实用程序,我知道:
如何从任何给定日期减去3天:
date -d "20110405 -3 days" "+%Y%m%d"
20110402
如何从今天开始的最后一个星期五:
date -d "last friday" "+%Y%m%d"
20110408
但我不知道如何从任何给定日期获得上周五:只
date -d "20110405 last friday" "+%Y%m%d"
返回给定日期:
20110405
关于如何做到这一点的任何想法?如果不能使用单行,那么几行脚本也会有所帮助.
在bash/GNU工具中是否有一些单行方式阻塞,直到文件中有匹配的字符串?理想情况下,超时.我想避免多行循环.
更新:似乎我应该强调我希望在字符串匹配时结束进程.
我有一个越狱(evasi0n)第4代iPad,带有iOS 6.1固件.
通过Cydia,我安装了移动终端,版本520-2.
然后,按照本教程,我下载并安装了CSU,Link Identify Editor,LibGCC,GCC和Headers/Libraries.
在安装过程中没有任何问题.
本教程和项目分别更新到2012年2月15日和2012年2月18日,因此它们可以正常运行到iOS 5.x(我已经在我的iPhone 4S,iOS 5.1.1上测试了这个程序,它可以工作,所以我可以在设备上编译和执行C代码)
但在我输入的iPad(iOS 6.1)移动终端上
$ gcc
我明白了
非法指导:4
在这些日子里我搜索了很多,但我在iOS 6.x上找不到关于GCC的任何信息,因为最近一次关于它的讨论在2012年10月12日更新,而evasi0n越狱程序已经从2月4日开始, 2013.
谢谢你的帮助.
UPDATE
似乎(从答案中)问题与iOS 6.x固件无关,而是与iPhone 5和iPad第4代的A6/A6X芯片无关.
我想创建一个可以比较2个字符串的宏,如果不满足条件则发出编译时错误.这可能是编译时断言.
我不知道怎么能这样做.
例如:
STATIC_COMPARE("THIS STRING","THIS STRING") -> would emit a compile time error
STATIC_COMPARE("THIS STRING","THIS OTHER STRING) -> wouldn't emit a compile time error.
Run Code Online (Sandbox Code Playgroud)
宏会看起来像
#define STATIC_COMPARE(str1,str2) if (str1==str2) emit an error with a message
Run Code Online (Sandbox Code Playgroud)
所以我想问题归结为能够在编译时比较2个字符串.
所以我正在查看gcc编译器的来源,我在fork.c中看到了这个:
int
__fork ()
{
__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__fork)
stub_warning (fork)
weak_alias (__fork, fork)
#include <stub-tag.h>
Run Code Online (Sandbox Code Playgroud)
我想弄清楚weak_alias的作用.我在glibc源文件中使用了grep命令来查找所有出现的#define weak_alias:
grep -r "#define weak_alias"
Run Code Online (Sandbox Code Playgroud)
我发现很多次出现的宏:
#define weak_alias(n, a)
Run Code Online (Sandbox Code Playgroud)
但宏并没有真正解释任何事情.他们只是定义了这个陈述,但没有说明它是如何被替换的.例如,一个出现在profil.c中:
/* Turn off the attempt to generate ld aliasing records. */
#undef weak_alias
#define weak_alias(a,b)
Run Code Online (Sandbox Code Playgroud)
那么有什么想法,weak_alias做什么以及它在哪里定义?
提前致谢
在我的Makefile中调用GREP的两种方式有什么不同吗?任何理由我应该使用其中一个?两者似乎都产生了相同的结果.
define GREP
$(word 3,$(shell echo "#define FOO 0xfff00100"))
endef
all:
@echo $(GREP)
@echo $(call GREP)
Run Code Online (Sandbox Code Playgroud) 假设我有两个文件,en.csv并且sp.csv,每个都包含正好两个逗号分隔的记录:
en.csv:
1,dog,red,car
3,cat,white,boat
Run Code Online (Sandbox Code Playgroud)
sp.csv:
2,conejo,gris,tren
3,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)
如果我执行
join -t, -a 1 -a 2 -e MISSING en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
1,dog,red,car
2,conejo,gris,tren
3,cat,white,boat,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)
请注意,所有缺少的字段都已折叠.要获得"正确的"全外连接,我需要指定一种格式; 从而
join -t, -a 1 -a 2 -e MISSING -o 0,1.2,1.3,1.4,2.2,2.3,2.4 en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)
产量
1,dog,red,car,MISSING,MISSING,MISSING
2,MISSING,MISSING,MISSING,conejo,gris,tren
3,cat,white,boat,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)
这种方式产生完全外连接的一个缺点是一个需要明确指定了决赛桌,这可能不容易编程的应用(如连接表的身份只有在运行时是已知的)做的格式.
最近版本的GNU join通过支持特殊格式消除了这个缺点auto.因此,join上面的最后一个命令的这种版本可以被更普遍的替换
join -t, -a 1 -a 2 -e MISSING -o auto en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)
如何join在不支持该-o auto选项的版本中实现同样的效果?
背景和细节
我有一个Unix shell(zsh)脚本,用于处理多个CSV平面文件,并通过广泛使用GNU join的'-o auto'选项来实现.我需要修改这个脚本,以便它可以在可用 …
所以我正在尝试向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) 在C中,该memmem函数用于定位存储区中的特定字节序列.它可以被同化strstr,专用于以null结尾的字符串.
是否有任何特殊原因使此函数可用作GNU扩展,而不是直接在标准库中?手册说明:
这个功能在Linux库中被破坏,包括libc 5.0.9; 在那里,针和干草堆参数被互换,并且返回了第一次出现针的末尾的指针.
旧的和新的libc都有错误,如果针是空的,则返回haystack-1(而不是haystack).并且glibc 2.0使情况变得更糟,返回指向haystack的最后一个字节的指针.这在glibc 2.1中得到修复.
我可以看到它经历了几次修复,但我想知道为什么它不像strstr某些发行版那样直接可用(如果不是更多).它是否仍然会带来实施问题?
编辑:动机.如果标准反过来决定它,我不会问这个问题:包括memmem但不是strstr.确实,strstr可能是这样的:
memmem(str, strlen(str), "search", 6);
Run Code Online (Sandbox Code Playgroud)
考虑到在C函数中通常需要数据块和它的长度,但是稍微复杂但仍然是一个非常合乎逻辑的单行.
编辑(2):评论和答案的另一个动机.引用Theolodis:
并非每个函数都是必需的,或者至少是大多数C开发人员,因此它实际上会使标准库变得不必要的巨大.
嗯,我完全同意,在使图书馆更轻,更快的时候,我总是在这里.但那么......为什么两者strncpy和memcpy(来自凯尔塔尔的评论)......?我几乎可以问:为什么穷人memmem被"黑色"?